Ich habe versucht, meinen Kopf um diesen für eine Weile jetzt zu bekommen, und mit Dank speziell auf Lars Kemmann und Tratcher, glaube ich, die akzeptierte Möglichkeit, dies zu tun, ist wie folgt:
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(
new CookieAuthenticationOptions { }
);
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = ConfigurationManager.AppSettings["ida:Wtrealm"],
MetadataAddress = ConfigurationManager.AppSettings["ida:FedMetadataURI"]
}
);
Es scheint, nicht intuitiv, dass Sie den Standard-Authentifizierungstyp als "Cookie-Authentifizierung" konfigurieren, um WsFederation zum Laufen zu bringen. Dies sind jedoch nur Zeichenfolgen zur Identifizierung jedes Middleware-Elements (damit können Sie den gleichen Typ von Middleware mehrmals registrieren. zum Beispiel), sie bewerten wie folgt:
CookieAuthenticationDefaults.AuthenticationType
= „Cookies“
WsFederationAuthenticationDefaults.AuthenticationType
= „Federation“
Was hier passiert, ist, dass wir OWIN doch sagen, dass die Middleware „Cookies“ bezeichnet sollte standardmäßig verwendet werden Anfragen zu authentifizieren, wir dann Fügen Sie die CookieAuthentication-Middleware hinzu (standardmäßig lautet sie "Cookies" aus dem Wert CookieAuthenticationDefaults.AuthenticationType
, so dass wir keinen zusätzlichen Code für die Einrichtung schreiben müssen). Schließlich fügen wir die Middleware FederationAuthentication hinzu (diese ist mit WsFederationAuthenticationDefaults.AuthenticationType
gekennzeichnet - z. B. " "Federation"), verstehe ich, dass die Federation-Middleware die Cookie-Middleware verwendet, um ihre authentifizierungsbezogenen Cookies zu verwalten.
Alles, was sie noch übrig ist, ist Ihre App zu tun konfigurieren, dass die Middleware zu einem Zeitpunkt Ihrer Wahl aufzurufen, kann dies in einer Reihe von Wegen erreicht werden, von denen einige sind wie folgt:
- Durch die Rückgabe eine HTTP-401-Antwort
- das
[Authorize]
Attribut auf einer MVC-Controller
- Durch den Aufruf der OWIN Context
IAuthenticationManager
‚s Challenge
Methode (vorbei in das Etikett Ihres Federation Middleware)
Durch die Verwendung von
Als ich diese Frage gestellt here, Lars mit einem ordentlichen Beispiel beantwortet, wie die Authentifizierung für alle Anforderungen zu verlangen, ich gebündelt es dann in die Pipeline OWIN wie folgt:
app.Use(
(context, continuation) =>
{
if (
(context.Authentication.User != null) &&
(context.Authentication.User.Identity != null) &&
(context.Authentication.User.Identity.IsAuthenticated)
)
{
return continuation();
}
else
{
context.Authentication.Challenge(WsFederationAuthenticationDefaults.AuthenticationType);
return Task.Delay(0);
}
}
);
Beachten Sie, dass im ersten Beispiel oben, zog ich die Wtrealm und MetadataAddress Werte in meine Config-Datei für eine einfache Wartung, sie sind nur einfache Anwendungseinstellungen:
<appSettings>
<add key="ida:Wtrealm" value="[app-uri]" />
<add key="ida:FedMetadataURI" value="https://[adfs-server]/federationmetadata/2007-06/federationmetadata.xml" />
</appSettings>
I hoffe das hilft.
benötigt Installationspaket Microsoft.Owin.Security.Cookies – BozoJoe