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"
}
}