Überlegungen zum Entwurf
In diesem Thema werden Überlegungen zum Entwurf erläutert.
Best Practices für ClaimsPrincipal.IsInRole
Anmeldefehler aufgrund von Groß-/Kleinschreibung
Bestimmte Konfigurationseinstellungen werden ignoriert
Kompatibilität mit IssuedTokenAuthentication.KnownCertificates
Konfigurieren der virtuellen Verzeichnisse des WCF-Diensts, um anonymen Zugriff zuzulassen
ConfigureServiceHost
Cookiemodus-SSPI-Authentifizierung wird nicht unterstützt
FederatedPassiveSignIn.AutoSignIn-Umleitung
Handhabung von wtrealm und wreply
Verwenden von SAML 2-Token
IPrincipal und IClaimsPrincipal
Ausnahme "Kontingent überschritten" beim Verwenden von SAML2-Token, die ActAs-Ansprüche enthalten
Sichere Konversationen
Ausstellername des Sicherheitstokendiensts
Ablaufzeitpunkt des SessionSecurityToken
Einige Ansprüche und ClaimsIdentity-Eigenschaften werden nicht serialisiert
SPNego-Authentifizierungsmodus
Fehler bei der SSL-Zertifikatüberprüfung
Threadsicherheit bei der Reserialisierung von Bootstraptoken
Kompatibilität mit WCF-Authentifizierungsflags
WS-Trust-Verben
Konfigurieren der virtuellen Verzeichnisse des WCF-Diensts, um anonymen Zugriff zuzulassen
Wenn Sie WIF auf einem WCF-Dienst aktivieren, wird von WSTrustServiceHost die automatische MEX-Endpunktveröffentlichung für den Dienst aktiviert. Daher müssen Sie das virtuelle Verzeichnis des Diensts konfigurieren, um anonymen Zugriff zuzulassen. WSTrustServiceHost ist in der Regel einem STS zugeordnet, dem Dienst können möglicherweise jedoch auch Nicht-STS-Endpunkte hinzugefügt werden. WIF aktiviert MEX nicht für Nicht-STS-Dienste. Sie können anonymen MEX deaktivieren, indem Sie DisableWsdl auf true festlegen. Dies empfiehlt sich in Produktionsumgebungen, um bestimmten MEX-Angriffen entgegenzuwirken. Beachten Sie auch, dass WIF MEX auf den gleichen Basisadressen aktiviert, die beim WSTrustServiceHost registriert sind. Daher wird anonymer MEX nur aktiviert, wenn ein Endpunkt beim HTTP-Protokoll registriert wird, und MEX über HTTPS ist nur verfügbar, wenn ein Endpunkt beim HTTPS-Protokoll registriert wird.
Einige Ansprüche und ClaimsIdentity-Eigenschaften werden nicht serialisiert
Die folgenden Eigenschaften sind für die Verwendung durch die vertrauende Seite gedacht, deshalb werden sie nicht im Netzwerk ausserialisiert. Zudem hat ihre Festlegung während der Tokenausstellung keine Auswirkungen:
Claim.Issuer. Die
Issuer
-Eigenschaft wird nach dem Empfang des Rückgabewerts von IssuerNameRegistry für X509-und SAML-Token aufgefüllt.Claim.Properties. Die
Properties
-Eigenschaft wird standardmäßig ignoriert und nicht im Netzwerk ausserialisiert.ClaimsIdentity.Label. Die
Label
-Eigenschaft soll nach dem Empfang von der Richtlinie der vertrauenden Seite aufgefüllt werden.ClaimsIdentity.NameClaimType. Die
NameClaimType
-Eigenschaft wird auf der empfangenden Seite verwendet, um auszuwählen, welcher Anspruchswert fürIIdentity.Name
verwendet wird.ClaimsIdentity.RoleClaimType. Die
RoleClaimType
-Eigenschaft wird auf der empfangenden Seite verwendet, um auszuwählen, welcher Anspruchswert bei der Ausstellung eines Tokens fürIsInRole()
verwendet wird.ClaimsIdentity.AuthenticationType. Die
AuthenticationType
-Eigenschaft wird auf der empfangenden Seite festgelegt, wenn ein Tokenhandler ein Token überprüft, und sie gibt an, wie das Token überprüft wurde.
Threadsicherheit bei der Reserialisierung von Bootstraptoken
Beim Reserialisieren von SAML-Bootstraptoken (z. B. in einem ActAs-Szenario) mit mehreren Threads müssen Sie die Aufrufe synchronisieren. Andernfalls werden die Token möglicherweise beschädigt. Weitere Informationen zu ActAs finden Sie unter Identitätsdelegationsszenario und Häufig gestellte Fragen.
ConfigureServiceHost
ConfigureServiceHost konfiguriert eine vertrauende Seite von Windows Communication Foundation (WCF) mit Windows® Identity Foundation (WIF). Verwenden Sie die Überladungen dieser Methode, um Konfigurationsdetails anzugeben.
Sichere Konversationen
Wenn Sie keine sicheren Konversationssitzungen zwischen dem Tokenanforderer und dem STS festlegen möchten, müssen Sie die Funktion für sichere Konversation deaktivieren. Im Gegensatz zu WsHttpBinding können Sie bei der WSFederationHttpBinding-Klasse die sicheren Konversationen nicht deaktivieren. Stattdessen müssen Sie eine benutzerdefinierte Bindung erstellen, die die sicheren Sitzungseinstellungen durch einen Bootstrap ersetzt. Ein Beispiel hierfür finden Sie in der Datei "app.config" des Clients im Beispiel "Webdienst/ClaimsAwareWebService" aus dem Beispielverzeichnis. Im folgenden Beispiel wird die relevante Konfiguration veranschaulicht.
<customBinding> <binding name="MyCustomBinding"> <security authenticationMode="IssuedTokenForCertificate"> </security> <!-- Andere Bindungselemente wie httpTransport werden hier platziert --> </binding> </customBinding>
Der Kernpunkt besteht darin, den SecureConversation-Authentifizierungsmodus nicht zu verwenden. Weitere Informationen zur Ausführung dieser Konfiguration in Code finden Sie unter Vorgehensweise: Deaktivieren von sicheren Konversationen bei einer WsFederationHttpBinding.
Best Practices für ClaimsPrincipal.IsInRole
Diese Überlegung bezieht sich auf ein Szenario, in dem Sie mehrere Anspruchstypen konfiguriert haben und IsInRole zum Festlegen der Zugriffsteuerung verwenden möchten. Es wird empfohlen, nicht mehrere Rollenanspruchstypen mit den gleichen Anspruchswerten zu verwenden. Stattdessen sollten Sie nur einen Rollenanspruchstyp verwenden.
Nehmen Sie beispielsweise an, Sie haben mehrere Rollenanspruchstypen konfiguriert: http://.../Role
und http://.../Group
. Das eingehende Token enthält Group:Editor
. Wenn die Anwendung IsInRole(“Editor”)
aufruft, wird true zurückgegeben, da das Token Group:Editor
enthält. Wenn Sie jedoch möchten, dass Ihre Anwendung nur Zugriff gewährt, wenn das Token Role:Editor
enthält (wenn also Group:Editor
nicht ausreichend sein soll), wird dies von WIF nicht unterstützt.
Wahlweise können Sie das Anspruchsmodell direkt verwenden und nicht IsInRole verwenden.
SPNego-Authentifizierungsmodus
SPNego ist der Standardauthentifizierungsmodus für WsHttpBinding
. SPNego wird unterstützt, wenn RequireCancellationtrue oder false ist. Es wird nicht jedoch unterstützt, wenn RequireCancellation auf false festgelegt ist, da dies auf einen Cookiemodus auf der Aushandlungsebene hinweist. Das Festlegen von RequireCancellation auf true weist auf einen Sitzungsmodus auf der Aushandlungsebene hin, der unterstützt wird. Beachten Sie außerdem, dass ClaimsAuthenticationManager im SSPI-Fall nicht aufgerufen wird.
https://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod
- und https://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationinstant
-Ansprüche werden für SPNego nicht generiert.
Außerdem werden Bootstraptoken für SPNego nicht unterstützt. In diesem Fall ist die Bootstraptoken-Sammlung leer.
Cookiemodus-SSPI-Authentifizierung wird nicht unterstützt
Cookiemodus SSPI-Authentifizierung wird nicht unterstützt Es gibt zwei Möglichkeiten, nicht unterstützte Bindungen abzurufen, die SSPI-Authentifizierung ausführen können:
Wandeln Sie eine
WSHttpBinding
in eine benutzerdefinierte Bindung um, und legen Sie RequireCancellation auf false fest.Rufen Sie
SymmetricSecurityBindingElement.CreateSspiNegotiationBindingElement
auf.
Ausnahme "Kontingent überschritten" beim Verwenden von SAML2-Token, die ActAs-Ansprüche enthalten
Wenn Sie versuchen, SAML 2-Token zu verwenden, die ActAs-Ansprüche enthalten, erhalten Sie möglicherweise die Ausnahme "Kontingent überschritten". Das liegt daran, dass der ActAs-Anspruch möglicherweise bewirkt, dass das SAML 2-Token die von Windows Communication Foundation (WCF) auferlegte Standardtokengröße von 8K überschreitet. Weitere Informationen finden Sie unter https://go.microsoft.com/fwlink/?LinkId=150815
Verwenden von SAML 2-Token
Für eine RP-Anwendung, die ASP.NET verwendet, müssen Sie den Standardtokentyp des STS auf SAML2 festlegen oder die STS-Richtlinie ändern, um den RST TokenType ordnungsgemäß auf SAML2 pro Anforderung festzulegen. Im folgenden Codebeispiel ist dies dargestellt:
// // Bei der Verwendung von WS2007FederationHttpBinding // WS2007FederationHttpBinding binding = new WS2007FederationHttpBinding(); binding.Security.Message.IssuedTokenType = Saml2SecurityTokenHandler.TokenProfile11TokenType;
Für eine RP-Anwendung, die ASP.NET verwendet, müssen Sie den Standardtokentyp des STS auf SAML2 festlegen. In der RP-Anwendung müssen keine Festlegungen vorgenommen werden. Die Anwendung akzeptiert alle Token, die sie verarbeiten kann. Im folgenden Codebeispiel ist dies dargestellt:
// Im SecurityTokenServiceConfiguration-Konstruktor kann Folgendes hinzugefügt werden: this.DefaultTokenType = Saml2SecurityTokenHandler.TokenProfile11TokenType;
Ausstellername des Sicherheitstokendiensts
Beachten Sie, dass der STS-Ausstellername immer auf einen gültigen und absoluten, nicht auf einen relativen URI festgelegt werden sollte:
SecurityTokenServiceConfiguration stsConfig = new SecurityTokenServiceConfiguration(“https://localhost:8081/STS”); SecurityTokenService sts = new SecurityTokenService(stsConfig);
Das hat folgenden Grund: Wenn ein STS eine verwaltete Karte ausstellt und der STS nicht für die Verwendung einer gültigen URL als Ausstellername konfiguriert wurde, kann die Karte von CardSpace nicht importiert werden.
Anmeldefehler aufgrund von Groß-/Kleinschreibung
So reproduzieren Sie den Anmeldefehler, wenn der Cookiepfad aufgrund der Groß-/Kleinschreibung nicht mit der URL der letzten Umleitung übereinstimmt:
Richten Sie eine passive ASP.NET-Verbundanwendung der vertrauenden Seite (relying party, RP) ein, deren virtuelles Verzeichnis Großbuchstaben einschließt, z. B. "MyRP".
Versuchen Sie, mit einer URL, in der das virtuelle Verzeichnis in Kleinbuchstaben geschrieben wird (z. B. "myrp"), auf die RP zuzugreifen. Beispielsweise können Sie einen STS-Anbieter (Sicherheitstokendienst, Security Token Service) so programmieren oder konfigurieren, dass ein Token für die RP mit einer derartigen URL bereitgestellt wird.
Die Clientanmeldung schlägt fehl.
Dies tritt auf, da das auf dem Client geschriebene Cookie vom Browser des Clients nicht an die Webanwendung zurückgesendet wird, da das PATH-Attribut des Cookies in der Groß-/Kleinschreibung nicht mit der angeforderten URL übereinstimmt. Das bedeutet, das PATH-Attribut verweist auf das virtuelle Verzeichnis als "MyRP", wohingegen die angeforderte URL "myrp" ist. Das PATH-Attribut wird mithilfe von AppDomainAppVirtualPath direkt aus dem Namen des virtuellen Verzeichnisses entnommen. Da der Clientbrowser beim Abgleichen der Cookiepfade die Groß-/Kleinschreibung beachtet, wird das Verbundcookie nach der nachfolgenden Umleitung nie zurückgesendet.
Um dieses Problem zu vermeiden, stellen Sie sicher, dass die URL auf den Webanwendungsinhalt mit der richtigen Groß-/Kleinschreibung verweist, wenn Sie auf die RP zugreifen möchten.
Fehler bei der SSL-Zertifikatüberprüfung
So reproduzieren Sie das Fehlschlagen der SSL-Zertifikatüberprüfung, wenn WinHTTP nicht mit Proxykonfigurationsproblem bereitgestellt wird:
Richten Sie eine Anwendung ein, die eine Verbindung mit einem Webdienst herstellt, der SSL verwendet. Die Anwendung soll als Netzwerkdienst oder lokales System ausgeführt werden. Konfigurieren Sie die Anwendung so, dass sie einen Proxyserver in der Datei "app.config" verwendet, um eine Verbindung herzustellen.
Die Anwendung löst folgende Ausnahme aus:
WebException: System.Net.WebException: Webdienstverbindung konnte nicht hergestellt werden: Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden. ---> System.Net.WebException: Die zugrunde liegende Verbindung wurde geschlossen: Für den geschützten SSL/TLS-Kanal konnte keine Vertrauensstellung hergestellt werden. ---> System.Security.Authentication.AuthenticationException: Das Remotezertifikat ist laut Validierungsverfahren ungültig.
Dies tritt auf, da die Anwendung .NET mit der Proxykonfiguration in der Datei "app.config" bereitstellt, WinHTTP jedoch nicht über die Proxykonfiguration informiert wird. Aus diesem Grund schlagen die Anforderungen für AIA/Zwischenzertifizierungsstellen während der Zertifikatkettenüberprüfung fehl.
Um dieses Problem zu vermeiden, verwenden Sie entweder "proxycfg.exe" oder die WinHttpSetDefaultProxyConfiguration-Funktion, um den WinHTTP-Proxy für die Übereinstimmung mit der Datei "app.config" der Anwendung zu konfigurieren.
WS-Trust-Verben
Standardmäßig unterstützt ein STS, der mit WIF erstellt wurde, nur das "issue"-Verb. Er stellt nicht die Verben "renew", "cancel" oder "validate" bereit, wie es bei WSDL-Vorgängen der Fall ist. Sie können dieses Verhalten anpassen, indem Sie IsOperationSupported überschreiben.
FederatedPassiveSignIn.AutoSignIn-Umleitung
Wenn Sie AutoSignIn für das FederatedPassiveSignIn-Steuerelement auf "true" festlegen, stellen Sie sicher, dass Sie DestinationPageUrl auf eine andere URL als die Anmeldeseite festgelegt haben. Andernfalls gerät der Browser in eine unendliche Umleitungsschleife, wenn ein Benutzer erfolgreich für einen STS authentifiziert wird. Das hat folgenden Grund: Wenn der Benutzer auf die gleiche Seite umgeleitet wird, die ihn ursprünglich an den STS gesendet hat, erkennt das Steuerelement, dass die aktuelle Anforderung kein Postback ist und kein Token enthält. Daher sendet es den Benutzer erneut an den STS.
IPrincipal und IClaimsPrincipal
Wenn eine Anwendung eine Dienstanforderung empfängt, stehen dieser zwei Methoden zur Verfügung, um den Aufrufer zu ermitteln. Die erste Methode ist die Verwendung der IPrincipal-Klasse und der IIdentity-Klasse. Dieser Ansatz wird sowohl von ASP.NET als auch von WCF unterstützt und WIF ist auf beiden Plattformen vollständig in dieses Modell integriert. So kann der vorhandene Code mit dem neuen, anspruchsbasierten Identitätsmodell und Authentifizierungsmodi verwendet werden. WIF kann Werte für einen bestimmten Anspruchstyp als .NET Framework-Identitätsrollen verfügbar machen, damit IsInRole
für die Autorisierung in diesem Anwendungscode verwendet werden kann. Der Anwendungscode oder der Administrator kann einen Anspruchstyp-URI auswählen, und das .NET-Identitätsmodell macht alle Werte als Rollen verfügbar, die diesem im Prinzipal des Aufrufers angezeigten Anspruchstyp zugeordnet sind.
Der zweite Ansatz besteht darin, die IClaimsPrincipal-Klasse zu verwenden, die von WIF bereitgestellt wird. Im Gegensatz zum .NET-Identitätsmodell macht diese Klasse die von WIF bereitgestellten Ansprüche direkt verfügbar. Dadurch werden alle verfügbaren Informationen über den Aufrufer bereitgestellt. Wenn Sie WIF aktiviert haben, sollten Sie IClaimsPrincipal verwenden. Hinweis: Wenn WIF in WCF aktiviert wird, kann der WCF ServiceSecurityContext
nicht zum Abrufen der Identität und der Ansprüche des Aufrufers verwendet werden. Der Anwendungscode muss den IClaimsPrincipal verwenden, um auf die Aufruferinformationen zugreifen zu können. Sie können die IClaimsPrincipal-Instanz mithilfe von Thread.CurrentPrincipal
abrufen. Dieser ist für jeden Authentifizierungstyp verfügbar, sobald WIF für die Anwendung WCF aktiviert wird.
Hinweis
Sie sollten nicht auf Thread.CurrentPrincipal
verweisen, während Ereignisse von WsFederationAuthenticationModule oder SessionAuthenticationModule ausgelöst werden. Thread.CurrentPrincipal
wird nach dem Authentifizierungsvorgangs festgelegt, Ereignisse hingegen werden während des Authentifizierungsvorgangs ausgelöst.
Ablaufzeitpunkt des SessionSecurityToken
Wenn der Benutzer sich entscheidet, für seine RP-Anwendung Cookies auszugeben, wird die Lebensdauer des entsprechenden SessionSecurityToken auf die gleiche Länge festgelegt wie die Eigenschaft SessionSecurityTokenHandler im DefaultTokenLifetime. Um die Gültigkeitsdauer des Tokens zu ändern, sollten Sie ein benutzerdefiniertes SessionSecurityTokenHandler einbinden. WIF unterstützt das Festlegen der Lebensdauer eines SessionSecurityToken über "web.config" oder "app.config" nicht.
Kompatibilität mit WCF-Authentifizierungsflags
Kunden, die von den im Folgenden aufgeführten WCF-Authentifizierungsflags abhängig sind, werden feststellen, dass diese Flags keine Auswirkungen mehr haben. Dies zeigt sich in Form von Unterbrechungsszenarien, da WIF strengere Überprüfungen auf Tokenhandlerebene erzwingt, oder in Form von Verhaltensänderungen, wenn die Einstellung für den Überprüfungsmodus nicht berücksichtigt wird. Im Folgenden sind einige der Flags aufgeführt, die in WIF nicht unterstützt werden oder ersetzt wurden:
ServiceHost.Credentials.IssuedTokenAuthentication
ServiceHost.Credentials.ClientCertificate.Authentication
ServiceHost.Credentials.UserNameAuthentication
Kompatibilität mit IssuedTokenAuthentication.KnownCertificates
Wenn in WIF-aktivierten WCF-Webdiensten IssuedTokenAuthentication.KnownCertificates nicht festgelegt ist, wird das Framework standardmäßig auf den SimpleIssuerTokenResolver festgelegt, der alle Rohdaten-SKIs auflöst, die über das Netzwerk gesendet werden und bei anderen SKI-Typen fehlschlagen, z. B. IssuerSerial. Wenn IssuedTokenAuthentication.KnownCertificates festgelegt ist, erstellt das Framework standardmäßig eine Tokenauflösung aus dem KnownCertificates-Satz. Diese Auflösung funktioniert jedoch nicht bei Rohdaten-SKIs, die nicht im KnownCertificates-Satz sind. Dies ist das aktuelle Verhalten seit dieser Betaversion.
Handhabung von wtrealm und wreply
Eine an einen STS gesendete Anmeldeanforderungsmeldung muss entweder einen wtrealm-Parameter oder einen wreply-Parameter enthalten. Der wtrealm-Parameter sollte für Richtlinienentscheidungen verwendet werden. Vor der Verwendung des wreply-Parameters als Umleitungs-URL sollte unbedingt anhand der Richtlinie überprüft werden, ob dessen Wert vertrauenswürdig ist.
Bestimmte Konfigurationseinstellungen werden ignoriert
Im <tokenhandlerconfiguration>
-Element werden Konfigurationseinstellungen auf <certificateValidation>
-Ebene ignoriert, wohingegen jene auf <certificateValidator>
-Ebene berücksichtigt werden. Dies wird im folgenden Konfigurationsbeispiel dargestellt:
<tokenHandlerConfiguration> <! – Folgende Einstellungen werden ignoriert --> <certificateValidation mode="ignored" revocationMode="ignored" trustedStoreLocation="ignored"> <! – Die folgenden Einstellungen werden berücksichtigt --> <certificateValidator type="honored" /> </certificateValidation> </tokenHandlerConfiguration>
Wenn sowohl auf den <serviceConfiguration>
-Ebenen als auch auf den <securityTokenHandlers>
-Ebenen Konfigurationseinstellungen angegeben werden, werden jene auf <securityTokenHandlers>
-Ebene berücksichtigt, während die auf <serviceConfiguration>
-Ebene ignoriert werden. Dies wird im folgenden Konfigurationsbeispiel dargestellt:
<serviceConfiguration> <issuerNameRegistry type="ignored" /> <serviceTokenResolver type="ignored" /> <audienceUris> ignored </audienceUris> <certificateValidation> ignored </certificateValidation> <issuerTokenResolver type="ignored" /> <securityTokenHandlers> <securityTokenHandlerConfiguration> <issuerNameRegistry type="honored" /> <serviceTokenResolver type="honored" /> <audienceUris> honored </audienceUris> <certificateValidation> honored </certificateValidation> <issuerTokenResolver type="honored" /> <securityTokenHandlerConfiguration> </securityTokenHandlers> </serviceConfiguration>
Festlegen von Eigenschaften in HTTP-Modulen in der Konfiguration, nicht mit Application_Start
In den HTTP-Modulen (ClaimsAuthorizationModule, ClaimsPrincipalHttpModule und SessionAuthenticationModule sowie WSFederationAuthenticationModule) im Application_Start
-Ereignishandler sollten keine Einstellungen festgelegt werden. Der Grund hierfür ist, dass der Handler nur einmal aufgerufen wird, jedoch möglicherweise mehrere Instanzen der HTTP-Module erstellt werden, deren Eigenschaften in diesem Fall nicht festgelegt sind. Stattdessen sollten Sie ihre Eigenschaften in der Konfiguration festlegen.