Identity Server 4: hinzufügen von Forderungen zu access token
Ich bin mit Identity Server 4 und Implizite Flow und möchten Sie einige Ansprüche an den access token, den neuen Forderungen oder Attribute sind "tenantId" und "langId".
Habe ich Hinzugefügt, langId wie einer meiner Bereiche nach unten und dann die Anforderung, dass durch den identity server, aber ich bekomme die tenantId auch. Wie kann das passieren?
Diese die Liste der Bereiche und client-Konfiguration:
public IEnumerable<Scope> GetScopes()
{
return new List<Scope>
{
//standard OpenID Connect scopes
StandardScopes.OpenId,
StandardScopes.ProfileAlwaysInclude,
StandardScopes.EmailAlwaysInclude,
new Scope
{
Name="langId",
Description = "Language",
Type= ScopeType.Resource,
Claims = new List<ScopeClaim>()
{
new ScopeClaim("langId", true)
}
},
new Scope
{
Name = "resourceAPIs",
Description = "Resource APIs",
Type= ScopeType.Resource
},
new Scope
{
Name = "security_api",
Description = "Security APIs",
Type= ScopeType.Resource
},
};
}
Client:
return new List<Client>
{
new Client
{
ClientName = "angular2client",
ClientId = "angular2client",
AccessTokenType = AccessTokenType.Jwt,
AllowedGrantTypes = GrantTypes.Implicit,
AllowAccessTokensViaBrowser = true,
RedirectUris = new List<string>(redirectUris.Split(',')),
PostLogoutRedirectUris = new List<string>(postLogoutRedirectUris.Split(',')),
AllowedCorsOrigins = new List<string>(allowedCorsOrigins.Split(',')),
AllowedScopes = new List<string>
{
"openid",
"resourceAPIs",
"security_api",
"role",
"langId"
}
}
};
Habe ich die Forderungen in ProfileService:
public class ProfileService : IdentityServer4.Services.IProfileService
{
private readonly SecurityCore.ServiceContracts.IUserService _userService;
public ProfileService(SecurityCore.ServiceContracts.IUserService userService)
{
_userService = userService;
}
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
//hardcoded them just for testing purposes
List<Claim> claims = new List<Claim>() { new Claim("langId", "en"), new Claim("tenantId", "123") };
context.IssuedClaims = claims;
return Task.FromResult(0);
}
Dies ist, was ich bin anfordern, um die token, das problem ist, ich bin nur Interesse an der langId aber ich bin immer beide die tenantId und langId in der access-token
http://localhost:44312/account/login?returnUrl=%2Fconnect%2Fauthorize%2Flogin%3Fresponse_type%3Did_token%2520token%26client_id%3Dangular2client%26redirect_uri%3Dhttp%253A%252F%252Flocalhost:5002%26scope%3DresourceAPIs%2520notifications_api%2520security_api%2520langId%2520navigation_api%2520openid%26nonce%3DN0.73617935552798141482424408851%26state%3D14824244088510.41368537145696305%26
Decodiert access token:
{
"nbf": 1483043742,
"exp": 1483047342,
"iss": "http://localhost:44312",
"aud": "http://localhost:44312/resources",
"client_id": "angular2client",
"sub": "1",
"auth_time": 1483043588,
"idp": "local",
"langId": "en",
"tenantId": "123",
"scope": [
"resourceAPIs",
"security_api",
"langId",
"openid"
],
"amr": [
"pwd"
]
}
- Welche version von IdentityServer4 ist das?
- "IdentityServer4": "1.0.0-rc1-update2",
- Jede chance, die Sie aktualisiert haben, dies für IS4 1.0 final oder mit der version 1.2?
- Noch nicht, Warum? Gibt es irgendwelche Probleme?
- Ich versuche, Ansprüche aus dem token als gut, aber die neuere version von IS4 scheint nicht zu funktionieren mit diesem code. Ich habe schon überall auf der Suche nach einer Lösung, und Sie ist die nächste, die ich finden konnte.
- Für den access-token, überprüfen Sie Ihre ApiResource ist UserClaims. Quelle: github.com/IdentityServer/IdentityServer4/issues/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie überprüfen, Kontext.RequestedClaimTypes und filter aus Forderungen, die nicht angefordert wurden.
langId
Umfang in die Anfrage-url oben. Das access-token zurückgegeben tut nicht enthalten, wederlangId
nochtenantId
(also die Filterung ist hier nicht das problem). Und das ist es, was ich brauche, um zu verstehen, warum bei der Beantragung derlangId
wie in der Frage, die tenantId war in der access-token.Ich bin mit asp.net Identität und Entity Framework mit Identityserver4.
Dies ist mein Beispiel code, funktioniert gut und JWT enthält alle Rollen und Ansprüche
Können Sie sehen, wie die Umsetzung Identityserver4 mit ASP.Net Kern-Identität hier
http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html
https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/Quickstarts/6_AspNetIdentity
1 - Identität server-Start.cs
2 - IdentityServerConfig.cs
3 - IdentityProfileService.cs
4 - In meiner client mvc-core-Projekt, das ich Hinzugefügt 3 nuget-Pakete
.Microsoft.AspNetCore.Die Authentifizierung.Cookies
.Microsoft.AspNetCore.Die Authentifizierung.OpenIdConnect
.IdentityModel
5 - Dies ist meine startup.cs in meinem client mvc-Kern-Projekt
6 - In meinem API-fügte ich dieses nuget-Paket
.IdentityServer4.AccessTokenValidatio
und mein Start.cs ist wie diese
Jetzt kann ich mit [Autorisieren(Rolle="SuperAdmin, Admin")] in der client-web-app-und API-app.
außerdem habe ich Zugang zu Forderungen
IdentityProfileService
und es ist in der token, wissen Sie, wie Sie nur in einem bestimmten client und nicht in allen clients?. Das ist der Anspruch//Add more claims like this //claims.Add(new System.Security.Claims.Claim("Balance", user.Balance.ToString()));