2017-11-06 3 views
1

Ich verfüge über eine OWIN-App, die Benutzer mit Cookie-Authentifizierung authentifiziert. Wenn dies fehlschlägt, versucht sie die WS-Federated-Authentifizierung. Mit anderen Worten, wenn das korrekte Cookie nicht in der anfänglichen Anfrage vorhanden ist, dann gehe zu dem STS und hole das Sicherheitstoken ab.So stellen Sie sicher, dass die ursprüngliche Anforderungs-URL des Benutzers nach der vereinigten WS-Authentifizierung in der OWIN-App verwendet wird

Das Problem, das ich habe, ist sicherzustellen, dass die ursprüngliche URL-Anfrage des Benutzers erfüllt ist, wenn die föderierte Authentifizierung verwendet wird. Dank this post habe ich festgestellt, dass die Umleitungs-URL von der STS zurück zur OWIN-App die "Original" -URL im Abfrageparameter wctx enthält. Das Problem ist, dass dieser Wert, soweit ich sagen kann, mit WsFederationAuthenticationOptions.Wtrealm (vielleicht Wreply?) Festgelegt ist. Dies ist ein Problem, da diese Werte in der anfänglichen Konfiguration festgelegt sind. Ich möchte keinen hartcodierten Wert - ich möchte nur die URL, die der Benutzer ursprünglich verwendet hat (z. B. IOwinContext.Request.Uri). Die Dokumentation für Wtrealm und Wreply erklärt nicht, was die Werte sein sollten.

Ich dachte, ich sneakily Wtrealm auf die Anfrage URL des Benutzers einstellen könnte, bevor der STS Umleitung, aber anscheinend ist es bereits durch die Zeit RedirectToIdentityProvider Benachrichtigung eingestellt angehoben wird:

RedirectToIdentityProvider = context => 
{ 
    context.Options.Wtrealm = context.Request.Uri.ToString(); 
} 

Wer weiß, was der richtige Ansatz ist, ? Gibt es eine Möglichkeit, Wtrealm in der ursprünglichen Konfiguration die Anfrage URL des Benutzers zu machen? Oder ist Wtrealm nicht, was ich denke, und ich sollte das auf eine andere Weise nähern?

Antwort

0

Ich glaube, ich habe es herausgefunden. Wtrealm, wie ich vermutete, ist nicht das, was das Problem verursacht; Dies wird verwendet, um zu bestimmen, wo der STS erneut eintreten sollte, um die Verbundauthentifizierung zu beenden. Es gibt jedoch eine weitere Weiterleitungs-URL, die bestimmt, wohin nach der Authentifizierung zu gehen ist.

Ich durchforstete den Microsoft.Owin.Security.WsFederation Quellcode mit ILSpy, und ich fand heraus, dass es eine Eigenschaft gab, die ich nicht einstellte: AuthenticationProperties.RedirectUri. Diese RedirectUri-Eigenschaft muss festgelegt werden, bevor sie an den STS weitergeleitet wird, da sie nach der Authentifizierung später in InvokeAsync verwendet werden muss. Ich habe eine AuthenticateAllRequests Methode und ich initialisieren dieses AuthenticationProperties Objekt gibt:

private static void AuthenticateAllRequests(IAppBuilder app, params string[] authenticationTypes) 
      { 
       app.Use((context, continuation) => 
       { 
        if (context.Authentication.User?.Identity?.IsAuthenticated ?? false) 
        { 
         return continuation(); 
        } 
        else 
        { 
         AuthenticationProperties authProps = new AuthenticationProperties 
         { 
          RedirectUri = context.Request.Uri.ToString() 
         }; 
         context.Authentication.Challenge(authProps, WsFederationAuthenticationDefaults.AuthenticationType); 
         return Task.CompletedTask; 
        } 
       }); 
      } 

konkreter Zusammenfassend sagen wir, meine OWIN Startup URL http://myapp.com/owin ist. Also dann setze ich Wtrealm = "http://myapp.com/owin". Nehmen wir an, ein Benutzer geht zu http://myapp.com/owin/coolstuff, und sagen wir, dass sie mit SSO im Authentifizierungsserver angemeldet sind, aber sie haben kein Cookie für meine App. In diesem Fall muss die WS-Federated-Authentifizierung verwendet werden. http://myapp.com/owin/coolstuff wird als AuthenticationProperties.RedirectUri festgelegt, bevor es an die STS weitergeleitet wird, so dass es in den Abfrageparameter wctx gestellt wird, und kann daher nach der Rückkehr zur OWIN-App verwendet werden.

Ich wurde vorher verwirrt, weil nach der Rückkehr von der STS, würde ich IOwinRequest.Uri = "http://myapp.com/owin" sehen, und ich würde davon ausgehen, dass die endgültige URL war, und dass die ursprüngliche Anfrage des Benutzers verloren ging. Jetzt ist es viel sinnvoller, dass dies die URL ist, zu der der STS umleitet, um die Authentifizierung zu beenden, aber die endgültige Weiterleitungs-URL http://myapp.com/owin/coolstuff wird zum Weiterleiten gespeichert, nachdem die Authentifizierung abgeschlossen ist.

Ich bin mir ziemlich sicher, dass es so funktioniert, aber ich mag mich irren und wenn jemand etwas hinzuzufügen hat, würde ich es gerne hören.

Verwandte Themen