Megosztás:


Token-szolgáltató

Ez a minta bemutatja, hogyan valósíthat meg egyedi jogkivonat-szolgáltatót. A Windows Communication Foundation (WCF) hitelesítési token szolgáltatója a hitelesítő adatok megadására szolgál a biztonsági infrastruktúra számára. A jogkivonat-szolgáltató általában megvizsgálja a célt, és megfelelő hitelesítő adatokat ad ki, hogy a biztonsági infrastruktúra biztonságossá tegye az üzenetet. A WCF az alapértelmezett Credential Manager-jogkivonat-szolgáltatóval szállít. A WCF egy CardSpace-jogkivonat-szolgáltatóval is rendelkezik. A speciális token szolgáltatók a következő esetekben hasznosak:

  • Ha olyan hitelesítőadat-tárolóval rendelkezik, amellyel ezek a jogkivonat-szolgáltatók nem működhetnek.

  • Ha saját egyéni mechanizmust szeretne biztosítani a hitelesítő adatok átalakításához attól a ponttól kezdve, amikor a felhasználó megadja a részleteket, hogy a WCF ügyfél-keretrendszer mikor használja a hitelesítő adatokat.

  • Ha egyéni jogkivonatot hoz létre.

Ez a minta bemutatja, hogyan hozhat létre egyéni jogkivonat-szolgáltatót, amely a felhasználó bemenetét egy másik formátumba alakítja át.

Összegzésként 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 állítható be egy ügyfél konfigurációja egyéni jogkivonat-szolgáltatóval?

  • Hogyan ellenőrizheti a kiszolgáló az ügyfél hitelesítő adatait jelszóval egy olyan egyéni UserNamePasswordValidator jelszóval, amely ellenőrzi, hogy a felhasználónév és a jelszó egyezik-e.

  • Hogyan hitelesíti a kiszolgálót az ügyfél a kiszolgáló X.509-tanúsítványával.

Ez a minta azt is bemutatja, hogyan érhető el a hívó identitása 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 kötést egy szabványos wsHttpBinding-val konfigurálták, amely alapértelmezés szerint üzenetbiztonságot használ. 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 a serviceCredentials viselkedés használatával konfigurálja a szolgáltatási tanúsítványt. A szolgáltatás hitelesítő adatainak viselkedése lehetővé teszi egy szolgáltatástanúsítvány konfigurálá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. Az ügyfélkötés a megfelelő Mode és az üzenettel clientCredentialTypevan konfigurálva.

<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 alábbi lépések bemutatják, hogyan fejleszthet egyéni jogkivonat-szolgáltatót, és hogyan integrálhatja azt a WCF biztonsági keretrendszerrel:

  1. Egyéni token-szolgáltató létrehozása.

    A minta egy egyéni token szolgáltatót implementál, amely megszerzi a felhasználónevet és a jelszót. A jelszónak meg kell egyeznie ezzel a felhasználónévvel. Ez az egyéni jogkivonat-szolgáltató csak bemutató célokra szolgál, és nem ajánlott a valós üzembe helyezéshez.

    A feladat végrehajtásához az egyéni token szolgáltató levezeti az SecurityTokenProvider osztályt, és felülbírálja a GetTokenCore(TimeSpan) metódust. Ez az eljárás létrehoz és visszaad egy új UserNameSecurityToken-t.

    protected override SecurityToken GetTokenCore(TimeSpan timeout)
    {
        // obtain username and password from the user using console window
        string username = GetUserName();
        string password = GetPassword();
        Console.WriteLine("username: {0}", username);
    
        // return new UserNameSecurityToken containing information obtained from user
        return new UserNameSecurityToken(username, password);
    }
    
  2. Egyéni biztonsági jogkivonat-kezelő készítése.

    A SecurityTokenManager meghatározott SecurityTokenProvider létrehozására használják, amelyeket a SecurityTokenRequirement metódusban adnak át. A biztonsági token kezelővel token hitelesítőket és token szerializálókat is létrehozhat, de ezekre ez a példa nem terjed ki. Ebben a példában az egyéni biztonsági jogkivonat-kezelő örökli az osztályt ClientCredentialsSecurityTokenManager , és felülbírálja az CreateSecurityTokenProvider egyéni felhasználónév-jogkivonat-szolgáltató visszatérési módszerét, amikor az átadott jogkivonat-követelmények azt jelzik, hogy a felhasználónév-szolgáltatót kérik.

    public class MyUserNameSecurityTokenManager : ClientCredentialsSecurityTokenManager
    {
        MyUserNameClientCredentials myUserNameClientCredentials;
    
        public MyUserNameSecurityTokenManager(MyUserNameClientCredentials myUserNameClientCredentials)
            : base(myUserNameClientCredentials)
        {
            this.myUserNameClientCredentials = myUserNameClientCredentials;
        }
    
        public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement)
        {
            // if token requirement matches username token return custom username token provider
            // otherwise use base implementation
            if (tokenRequirement.TokenType == SecurityTokenTypes.UserName)
            {
                return new MyUserNameTokenProvider();
            }
            else
            {
                return base.CreateSecurityTokenProvider(tokenRequirement);
            }
        }
    }
    
  3. Egyéni ügyfél-hitelesítő adatok írása.

    Az ügyfél-hitelesítő adatok osztály az ügyfélproxyhoz 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 MyUserNameClientCredentials : ClientCredentials
    {
        public MyUserNameClientCredentials()
            : base()
        {
        }
    
        protected override ClientCredentials CloneCore()
        {
            return new MyUserNameClientCredentials();
        }
    
        public override SecurityTokenManager CreateSecurityTokenManager()
        {
            // return custom security token manager
            return new MyUserNameSecurityTokenManager(this);
        }
    }
    
  4. Konfigurálja az ügyfelet az egyéni ügyfél hitelesítő adatainak használatára.

    Annak érdekében, hogy az ügyfél az egyéni ügyfél hitelesítő adatait használja, a minta törli az alapértelmezett ügyfél-hitelesítő osztályt, és biztosítja az új ügyfél hitelesítőadat-osztályát.

    static void Main()
    {
        // ...
           // Create a client with given client endpoint configuration
          CalculatorClient client = new CalculatorClient();
    
          // set new credentials
           client.ChannelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
         client.ChannelFactory.Endpoint.Behaviors.Add(new MyUserNameClientCredentials());
       // ...
    }
    

A szolgáltatásban a hívó adatainak megjelenítéséhez használja az PrimaryIdentity alábbi kód példában 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);
}

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, hogy a kiszolgálót a megfelelő tanúsítvánnyal konfigurálja 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ábbiak rövid áttekintést nyújtanak a kötegfájlok különböző szakaszairól, hogy 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 érték 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 Setup.bat kötegfájl úgy van kialakítva, hogy windowsos 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. Írja be a felhasználónevet a felhasználónévre vonatkozó parancssorba.

  5. A jelszókérésnél használja ugyanazt a sztringet, amelyet a felhasználónév-kéréshez beírt.

  6. 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 Service.exe.config fájlt frissíteni kell, hogy tükrözze ezt az új tanúsítványnevet. A kiszolgálótanúsítványt a Setup.bat kötegfájl módosításával hozhatja létre. Vegye figyelembe, hogy a setup.bat fájlt rendszergazdai jogosultságokkal megnyitott Fejlesztői parancssorból kell futtatni. A %SERVER_NAME% változót annak a számítógépnek a teljesen minősített gazdagépnevére kell beállítania, amelyet a szolgáltatás üzemeltetéséhez használnak.

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

  5. A szolgáltatásszámítógép Service.exe.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 Client.exe a parancssori ablakbó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.