Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltásá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:
Í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(); }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; } }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
CreateSecurityTokenAuthenticatormetó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 azCreateSecurityTokenAuthenticatormó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); } } }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); } }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 -peA 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 TrustedPeopleMegjegyzé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
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.
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
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.
Indítsa el a service.exe a service\bin fájlból.
Indítsa el a client.exe a \client\bin fájlból. Az ügyféltevékenység megjelenik az ügyfélkonzol-alkalmazásban.
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
Hozzon létre egy címtárat a szolgáltatásszámítógépen a szolgáltatás bináris fájljaihoz.
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.
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.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.
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.
A szolgáltatás számítógépén futtassa a service.exe parancsot a parancssorban.
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.
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.
Az ügyfélszámítógépen indítsa el a Client.exe parancssorból.
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
- A minta végrehajtása után futtassa le a mintamappában lévő Cleanup.bat-t.