2016-09-28 3 views
0

Gegeben: A Identity Server die Strömung implizite und Ressourceneigentümer unterstützt. (Konfig siehe unten)IdentityServer BestPractive Kombinieren Implizite und RessourceOwner Workflow-

Ein Api, der IdentityServerBearerTokenAuthentication verwendet. Es handelt also grundsätzlich ein Passwort für einen Token, der für die Authentifizierung verwendet wird

A UI, die impliziten Workflow für auth verwendet.

Jetzt kann ich ein Bearer-Token vom Identity-Server bekommen, mit dem ich auf die geschützte API-Methode zugreifen kann.

Auch als Benutzer kann ich mich mit dem impliziten Fluss anmelden und geschützte Ansichten anzeigen.

Problem Die Probleme treten auf, wenn ein angemeldeter WebFrontEndUser auf eine geschützte API zugreifen möchte.

Der Benutzer meldet sich im UI mit dem impliziten Fluss an. Nachdem er sich authentifiziert hat, versucht er auf eine geschützte API zuzugreifen. Der Api gibt zurück, dass er nicht autorisiert ist.

Wie kann ich die Umgebung so konfigurieren, dass die API die Openid-Informationen aus dem Benutzer-Cookie verwendet?

Webseite Confing

app.UseCookieAuthentication(new CookieAuthenticationOptions 
      { 
       AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      }); 

      app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
      { 
       ClientId = "foo_implicit", 
       Authority = identServer, 
       RedirectUri = "http://localhost/foo/", 
       ResponseType = "token id_token", 
       Scope = "openid profile", 
       SignInAsAuthenticationType = DefaultAuthenticationTypes.ApplicationCookie 
      }); 

WebAPI Config

app.UseIdentityServerBearerTokenAuthentication(new IdentityServer3.AccessTokenValidation.IdentityServerBearerTokenAuthenticationOptions() 
     { 
      Authority = identServer 
     }); 

IdentityServer Client-Konfiguration

new Client 
       { 
        Enabled = true, 
        ClientId = "foo_implicit", 
        ClientName = "foo Site", 
        ClientSecrets = new List<Secret> 
        { 
         new Secret("foo".Sha256()) 
        }, 
        Flow = Flows.Implicit, 
        AllowedScopes = new List<string> 
        { 
         Constants.StandardScopes.OpenId, 
         Constants.StandardScopes.Profile, 
         "read" 
        }, 
        RedirectUris = new List<string>() 
        { 
         "http://localhost/foo/" 
        } 
       }, 
       new Client 
       { 
        Enabled = true, 
        ClientId = "foo", 
        ClientName = "foo api", 
        ClientSecrets = new List<Secret> 
        { 
         new Secret("foo".Sha256()) 
        }, 
        Flow = Flows.ResourceOwner, 
        AllowedScopes = new List<string> 
        { 
         Constants.StandardScopes.OpenId, 
         "read" 
        } 
       } 

Antwort

4

U sing OpenID Connect können Sie während der Authentifizierung sowohl Identity als auch Access Tokens anfordern. Sie erhalten bereits während der Authentifizierung ein Zugriffstoken (Antworttyp token), also würde ich das greifen und es verwenden, um auf die API zuzugreifen. Dies würde die Notwendigkeit eines separaten Ressourcenbesitzer-Clients verhindern.

Sie können diesen Zugriffstoken greifen die die OpenIdConnectAuthenticationNotifications Eigenschaft OpenIdConnectAuthenticationOptions verwenden, z.B .:

Notifications = new OpenIdConnectAuthenticationNotifications 
{ 
    SecurityTokenValidated = x => 
    { 
     x.AuthenticationTicket.Identity.AddClaim(new Claim("access_token", x.ProtocolMessage.AccessToken)); 
     return Task.FromResult(0); 
    } 
} 

Ihr auch IdentityServerBearerTokenAuthenticationOptions eine oder mehrere Scopes angeben sollte, dass ein Token für den Zugriff erfordert. Andernfalls kann jedes Zugriffstoken dieser Autorität auf Ihre API zugreifen. Weitere Informationen hierzu finden Sie unter documentation.

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
{ 
    Authority = identServer, 
    RequiredScopes = new[] { "api1" } 
});