Megosztás:


Token hitelesítő

Ez a minta bemutatja, hogyan implementálhat egyéni jogkivonat-hitelesítőt. A Windows Communication Foundation (WCF) jogkivonat-hitelesítője az üzenethez használt jogkivonat ellenőrzésére, az önkonzisztensség ellenőrzésére és a jogkivonathoz társított identitás hitelesítésére szolgál.

Az egyéni token-hitelesítők számos esetben hasznosak, például:

  • Ha felül szeretné bírálni a jogkivonathoz társított alapértelmezett hitelesítési mechanizmust.

  • Amikor egyéni tokent hoz létre.

Ez a minta a következőket mutatja be:

  • Hogyan hitelesíthet egy ügyfél felhasználónév/jelszó pár használatával?

  • Hogyan érvényesítheti a kiszolgáló az ügyfél hitelesítő adatait egy testreszabott jogkivonat-hitelesítő használatával.

  • Hogyan kapcsolódik a WCF szolgáltatáskódja az egyéni jogkivonat-hitelesítőhöz.

  • A kiszolgáló hitelesítésének menete a kiszolgáló X.509-tanúsítványával.

Ez a minta azt is bemutatja, hogyan érhető el a hívó identitása a WCF-ből az egyéni jogkivonat-hitelesítési folyamat után.

A szolgáltatás egyetlen végpontot tesz elérhetővé a szolgáltatással való kommunikációhoz, amely a App.config konfigurációs fájllal van definiálva. A végpont egy címből, egy kötésből és egy szerződésből áll. A kapcsolat egy szabványos wsHttpBinding-vel, üzenet alapú biztonsági móddal van konfigurálva, amely a wsHttpBinding alapértelmezett módja. Ez a minta beállítja a szabványt wsHttpBinding az ügyfél-felhasználónév-hitelesítés használatára. A szolgáltatás viselkedéssel is konfigurálja a szolgáltatástanúsítványt serviceCredentials . A securityCredentials viselkedés lehetővé teszi egy szolgáltatástanúsítvány megadását. Az ügyfél szolgáltatástanúsítványt használ a szolgáltatás hitelesítéséhez és az üzenetvédelem biztosításához. Az alábbi konfiguráció a mintabeállítás során telepített localhost-tanúsítványra hivatkozik az alábbi telepítési utasításokban leírtak szerint.

<system.serviceModel>
    <services>
      <service
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <host>
          <baseAddresses>
            <!-- configure base address provided by host -->
            <add baseAddress ="http://localhost:8000/servicemodelsamples/service" />
          </baseAddresses>
        </host>
        <!-- use base address provided by host -->
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>

    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
          <!--
          The serviceCredentials behavior allows one to define a service certificate.
          A service certificate is used by a client to authenticate the service and provide message protection.
          This configuration references the "localhost" certificate installed during the setup instructions.
....        -->
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>

Az ügyfélvégpont konfigurációja egy konfigurációs névből, a szolgáltatásvégpont abszolút címéből, a kötésből és a szerződésből áll. A klienskapcsolat megfelelő Mode és clientCredentialType konfigurációval van ellátva.

<system.serviceModel>
    <client>
      <endpoint name=""
                address="http://localhost:8000/servicemodelsamples/service"
                binding="wsHttpBinding"
                bindingConfiguration="Binding1"
                contract="Microsoft.ServiceModel.Samples.ICalculator">
      </endpoint>
    </client>

    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

Az ügyfél implementációja beállítja a használni kívánt felhasználónevet és jelszót.

static void Main()
{
     ...
     client.ClientCredentials.UserNamePassword.UserName = username;
     client.ClientCredentials.UserNamePassword.Password = password;
     ...
}

Egyéni token-hitelesítő

Az alábbi lépések végrehajtásával létrehozhat egyéni token-hitelesítőt:

  1. Írj egy egyedi jogkivonat-hitelesítőt.

    A minta egy egyéni token hitelesítőt valósít meg, amely ellenőrzi, hogy a felhasználónév érvényes e-mail formátummal rendelkezik-e. A UserNameSecurityTokenAuthenticator származtatja. Ebben az osztályban a legfontosabb módszer a ValidateUserNamePasswordCore(String, String). Ebben az eljárásban a hitelesítő ellenőrzi a felhasználónév formátumát, és azt is, hogy a gazdagép neve nem rosszindulatú tartományból származik. Ha mindkét feltétel teljesül, akkor egy csak olvasható IAuthorizationPolicy példánygyűjteményt ad vissza, amelyet a felhasználónév tokenben tárolt információkat képviselő jogcímek biztosítására használnak.

    protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateUserNamePasswordCore(string userName, string password)
    {
        if (!ValidateUserNameFormat(userName))
            throw new SecurityTokenValidationException("Incorrect UserName format");
    
        ClaimSet claimSet = new DefaultClaimSet(ClaimSet.System, new Claim(ClaimTypes.Name, userName, Rights.PossessProperty));
        List<IIdentity> identities = new List<IIdentity>(1);
        identities.Add(new GenericIdentity(userName));
        List<IAuthorizationPolicy> policies = new List<IAuthorizationPolicy>(1);
        policies.Add(new UnconditionalPolicy(ClaimSet.System, claimSet, DateTime.MaxValue.ToUniversalTime(), identities));
        return policies.AsReadOnly();
    }
    
  2. Adjon meg egy engedélyezési szabályzatot, amelyet egy egyéni jogkivonat-hitelesítő ad vissza.

    Ez a minta biztosít egy IAuthorizationPolicy nevű implementációt, amely visszaadja a konstruktorban átadott jogcímek és identitások készletét.

    class UnconditionalPolicy : IAuthorizationPolicy
    {
        String id = Guid.NewGuid().ToString();
        ClaimSet issuer;
        ClaimSet issuance;
        DateTime expirationTime;
        IList<IIdentity> identities;
    
        public UnconditionalPolicy(ClaimSet issuer, ClaimSet issuance, DateTime expirationTime, IList<IIdentity> identities)
        {
            if (issuer == null)
                throw new ArgumentNullException("issuer");
            if (issuance == null)
                throw new ArgumentNullException("issuance");
    
            this.issuer = issuer;
            this.issuance = issuance;
            this.identities = identities;
            this.expirationTime = expirationTime;
        }
    
        public string Id
        {
            get { return this.id; }
        }
    
        public ClaimSet Issuer
        {
            get { return this.issuer; }
        }
    
        public DateTime ExpirationTime
        {
            get { return this.expirationTime; }
        }
    
        public bool Evaluate(EvaluationContext evaluationContext, ref object state)
        {
            evaluationContext.AddToTarget(this, this.issuance);
    
            if (this.identities != null)
            {
                object value;
                IList<IIdentity> contextIdentities;
                if (!evaluationContext.Properties.TryGetValue("Identities", out value))
                {
                    contextIdentities = new List<IIdentity>(this.identities.Count);
                    evaluationContext.Properties.Add("Identities", contextIdentities);
                }
                else
                {
                    contextIdentities = value as IList<IIdentity>;
                }
                foreach (IIdentity identity in this.identities)
                {
                    contextIdentities.Add(identity);
                }
            }
    
            evaluationContext.RecordExpirationTime(this.expirationTime);
            return true;
        }
    }
    
  3. Egyéni biztonsági jogkivonat-kezelő írása.

    A SecurityTokenManager egy SecurityTokenAuthenticator létrehozására használatos meghatározott SecurityTokenRequirement objektumok számára, amelyeket a CreateSecurityTokenAuthenticator metódus ad át neki. A biztonsági token kezelő token-szolgáltatókat és token-szerializálókat is létrehozhat, de ezekre a minta nem terjed ki. Ebben a példában az egyéni biztonsági jogkivonat-kezelő a(z) ServiceCredentialsSecurityTokenManager osztálytól örököl, és felülbírálja az CreateSecurityTokenAuthenticator módszert, hogy visszaadja az egyéni felhasználónév jogkivonat-hitelesítőt, amikor az átadott jogkivonat-követelmények azt jelzik, hogy felhasználónév-hitelesítőt kér a rendszer.

    public class MySecurityTokenManager : ServiceCredentialsSecurityTokenManager
    {
        MyUserNameCredential myUserNameCredential;
    
        public MySecurityTokenManager(MyUserNameCredential myUserNameCredential)
            : base(myUserNameCredential)
        {
            this.myUserNameCredential = myUserNameCredential;
        }
    
        public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
        {
            if (tokenRequirement.TokenType ==  SecurityTokenTypes.UserName)
            {
                outOfBandTokenResolver = null;
                return new MyTokenAuthenticator();
            }
            else
            {
                return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver);
            }
        }
    }
    
  4. Egyéni szolgáltatási hitelesítő adat létrehozása.

    A szolgáltatás hitelesítő adatainak osztálya a szolgáltatáshoz konfigurált hitelesítő adatok megjelenítésére szolgál, és létrehoz egy biztonsági jogkivonat-kezelőt, amely a jogkivonat-hitelesítők, a jogkivonat-szolgáltatók és a jogkivonat-szerializálók beszerzésére szolgál.

    public class MyUserNameCredential : ServiceCredentials
    {
    
        public MyUserNameCredential()
            : base()
        {
        }
    
        protected override ServiceCredentials CloneCore()
        {
            return new MyUserNameCredential();
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            return new MySecurityTokenManager(this);
        }
    
    }
    
  5. Konfigurálja a szolgáltatást az egyéni szolgáltatás hitelesítő adatainak használatára.

    Ahhoz, hogy a szolgáltatás az egyéni szolgáltatás hitelesítő adatait használja, az alapértelmezett szolgáltatás hitelesítőadat-osztályát az alapértelmezett szolgáltatás hitelesítő adataiban már előre konfigurált szolgáltatástanúsítvány rögzítése után töröljük, és konfiguráljuk az új szolgáltatás hitelesítőadat-példányát az előre konfigurált szolgáltatástanúsítványok használatára, és hozzáadjuk ezt az új szolgáltatás hitelesítőadat-példányát a szolgáltatás viselkedéséhez.

    ServiceCredentials sc = serviceHost.Credentials;
    X509Certificate2 cert = sc.ServiceCertificate.Certificate;
    MyUserNameCredential serviceCredential = new MyUserNameCredential();
    serviceCredential.ServiceCertificate.Certificate = cert;
    serviceHost.Description.Behaviors.Remove((typeof(ServiceCredentials)));
    serviceHost.Description.Behaviors.Add(serviceCredential);
    

A hívó adatainak megjelenítéséhez használja az PrimaryIdentity alábbi kódban látható módon. A Current tartalmaz követelés információkat az aktuális hívóról.

static void DisplayIdentityInformation()
{
    Console.WriteLine("\t\tSecurity context identity  :  {0}",
            ServiceSecurityContext.Current.PrimaryIdentity.Name);
     return;
}

A minta futtatásakor a műveleti kérelmek és a válaszok megjelennek az ügyfélkonzol ablakában. Nyomja le az ENTER billentyűt az ügyfélablakban az ügyfél leállításához.

Batch-fájl beállítása

A mintában szereplő Setup.bat kötegfájl lehetővé teszi a kiszolgáló megfelelő tanúsítványokkal való konfigurálását egy olyan saját üzemeltetésű alkalmazás futtatásához, amely kiszolgálótanúsítvány-alapú biztonságot igényel. Ezt a kötegfájlt úgy kell módosítani, hogy a számítógépeken is működjön, vagy nem üzemeltetett esetben működjön.

Az alábbiakban röviden áttekintheti a kötegfájlok különböző szakaszait, hogy azok a megfelelő konfigurációban való futtatásukhoz módosíthatók legyenek.

  • A kiszolgálótanúsítvány létrehozása.

    A Setup.bat kötegfájl alábbi sorai hozzák létre a használni kívánt kiszolgálótanúsítványt. A %SERVER_NAME% változó megadja a kiszolgáló nevét. Módosítsa ezt a változót a saját kiszolgáló nevének megadásához. Ebben a kötegfájlban az alapértelmezett a localhost.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    
  • A kiszolgálótanúsítvány telepítése az ügyfél megbízható tanúsítványtárolójába.

    A Setup.bat kötegfájl alábbi sorai átmásolják a szerver tanúsítványt az ügyfél megbízható személyek tárhelyébe. Erre a lépésre azért van szükség, mert a Makecert.exe által létrehozott tanúsítványokat az ügyfélrendszer nem implicit módon megbízhatónak minősíti. Ha már rendelkezik olyan tanúsítvánnyal, amely egy ügyfél megbízható főtanúsítványában gyökerezik – például egy Microsoft által kiadott tanúsítványban –, nem szükséges az ügyféltanúsítvány-tároló kiszolgálótanúsítvánnyal való feltöltésének ez a lépése.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

    Megjegyzés:

    A telepítő kötegfájl úgy lett kialakítva, hogy egy Windows SDK parancssorból fusson. Ehhez az MSSDK környezeti változónak arra a könyvtárra kell mutatnia, amelyben az SDK telepítve van. Ez a környezeti változó automatikusan be van állítva egy Windows SDK parancssorban.

A minta beállítása és létrehozása

  1. Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.

  2. A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.

A minta futtatása ugyanazon a számítógépen

  1. Futtassa a Setup.bat a minta telepítési mappából egy rendszergazdai jogosultságokkal megnyitott Visual Studio-parancssorban. Ez telepíti a minta futtatásához szükséges összes tanúsítványt.

    Megjegyzés:

    A Setup.bat batch fájl úgy lett kialakítva, hogy a Visual Studio parancssorból fusson. A Visual Studio parancssorában beállított PATH környezeti változó a Setup.bat szkript által igényelt végrehajtható fájlokat tartalmazó könyvtárra mutat.

  2. Indítsa el a service.exe a service\bin fájlból.

  3. Indítsa el a client.exe a \client\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.

  4. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg a WCF minták hibaelhárítási tippeket a éscímsorok alatt.

A minta futtatása számítógépeken

  1. Hozzon létre egy címtárat a szolgáltatásszámítógépen a szolgáltatás bináris fájljaihoz.

  2. Másolja a szolgáltatásprogram fájljait a szolgáltatásszámítógép szolgáltatáskönyvtárába. Másolja a Setup.bat és Cleanup.bat fájlokat is a szolgáltatásszámítógépre.

  3. Rendelkeznie kell egy olyan kiszolgáló-tanúsítvánnyal, amelynek tárgyneve tartalmazza a számítógép teljesen minősített tartománynevét. A szolgáltatás App.config fájlt frissíteni kell, hogy tükrözze ezt az új tanúsítványnevet. Létrehozhat egyet a Setup.bat használatával, ha a változót annak a számítógépnek a %SERVER_NAME% teljesen minősített gazdagépnévként állítja be, amelyen a szolgáltatás futni fog. Vegye figyelembe, hogy a setup.bat fájlt rendszergazdai jogosultságokkal megnyitott Fejlesztői parancssorból kell futtatni.

  4. Másolja a kiszolgálótanúsítványt az ügyfél CurrentUser-TrustedPeople tárolójába. Ezt csak akkor kell megtennie, ha a kiszolgálótanúsítványt egy megbízható ügyfél kiállítója állítja ki.

  5. A szolgáltatásszámítógép App.config fájljában módosítsa az alapcím értékét úgy, hogy a localhost helyett egy teljesen minősített számítógépnevet adjon meg.

  6. A szolgáltatás számítógépén futtassa a service.exe parancsot a parancssorban.

  7. Másolja az ügyfélprogram fájljait a \client\bin\ mappából a nyelvspecifikus mappából az ügyfélszámítógépre.

  8. Az ügyfélszámítógép Client.exe.config fájljában módosítsa a végpont címértékét úgy, hogy az megfeleljen a szolgáltatás új címének.

  9. Az ügyfélszámítógépen indítsa el a Client.exe parancssorból.

  10. Ha az ügyfél és a szolgáltatás nem tud kommunikálni, tekintse meg a WCF minták hibaelhárítási tippeket a éscímsorok alatt.

A minta utáni tisztítás

  1. A minta végrehajtása után futtassa le a mintamappában lévő Cleanup.bat-t.