2014-04-24 6 views
13

Ich habe eine MVC-Intranetwebsite, die AD-Konten für die Authentifizierung verwenden muss.Verwenden Sie OWIN Ws-Federation-Paket zur Authentifizierung gegen ADFS 3.0

Ich habe ADFS 3.0 (Win Server 2012 R2) eingerichtet und folgte this, um den ADFS Relying Party Trust einzurichten.

This andere Post stellt die Ws-Federation OWIN-Komponenten vor und ich möchte es verwenden. Es wird erwähnt, wie eine Verbindung zu einem Azure AD hergestellt wird, aber nichts in Bezug auf ADFS.

Ich habe versucht, die Konfigurationseigenschaften „MetadataAddress“ und „Wtrealm“ zu entsprechen, was ich in ADFS konfiguriert Einstellung aber zur Laufzeit bekomme ich einen Fehler:

A default value for SignInAsAuthenticationType was not found in IAppBuilder Properties. 
This can happen if your authentication middleware are added in the wrong order, or if one is missing. 

ich für die richtige Art und Weise suchen diesen Fehler entfernen

Antwort

23

Ja .. Ich stieß auf das gleiche Problem. Just do sollte die folgende und es funktioniert:

app.SetDefaultSignInAsAuthenticationType(WsFederationAuthenticationDefaults.AuthenticationType); 

    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType 
    }); 
+0

benötigt Installationspaket Microsoft.Owin.Security.Cookies – BozoJoe

1

Eigentlich Sie nur diese Zeile fehlt, die in der Regel vor dem UseCookieAuthentication Methodenaufruf ist.

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

in Ihrem Fall wäre es

sein
app.UseExternalSignInCookie(WsFederationAuthenticationDefaults.AuthenticationType); 

Dies ist, was tatsächlich ausgeführt wird, wenn Sie UseExternalSignInCookie nennen (...), externalAuthenticationType ist, was Sie als String-Parameter übergeben in.

app.SetDefaultSignInAsAuthenticationType(externalAuthenticationType); 
CookieAuthenticationOptions options = new CookieAuthenticationOptions(); 
options.AuthenticationType = externalAuthenticationType; 
options.AuthenticationMode = AuthenticationMode.Passive; 
options.CookieName = ".AspNet." + externalAuthenticationType; 
options.ExpireTimeSpan = TimeSpan.FromMinutes(5.0); 
app.UseCookieAuthentication(options); 

Also, wenn alles, was Sie setzen die AuthenticationType ist, können Sie sicher rufen Sie einfach UseExternalSignInCookie wie sie es für Sie tut.

13

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.

+1

Genau richtig. Sie sehen, dass Microsofts empfohlener Ansatz genau dies ist, wenn Sie sich das Beispiel ansehen, das GitHub von Vittorio Bertocci zur Verfügung gestellt hat: https://github.com/AzureADSamples/WebApp-WSFederation-DotNet/blob/master/WebApp-WSFederation-DotNet/App_Start/ Startup.Auth.cs –

+0

Ich fand, dass mit ** app.SetDefaultSignInAsAuthenticationType (CookieAuthenticationDefaults.AuthenticationType); ** führte zu einer Authentifizierungsschleife in der Ausnahme führte: ** MSIS7042: Die gleiche Client-Browser-Sitzung hat '6' gemacht Anfragen in den letzten '1' Sekunden ** während ** app.SetDefaultSignInAsAuthenticationType (WsFederationAuthenticationDefaults.AuthenticationType); ** arbeitete für mich; und übergab definitiv Cookies nach dem ersten Authentifizierungs-Handshake – AndyWarby