最近我正在使用IdentityServer4进行单点登录,当我调试代码时,我发现ResponseType设置导致了一个棘手的问题。当我这样设置我的客户端时:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = Configuration["Auth:IdentityServer"];
options.RequireHttpsMetadata = false;
options.ClientId = Configuration["Auth:ClientId"];
options.ClientSecret = Configuration["Auth:ClientSecret"];
options.ResponseType = "id_token";
options.SaveTokens = true;
//options.Scope.Add("8e6144b5-87f6-4638-bf08-1a64599a8b39");
options.Scope.Add("offline_access");
options.GetClaimsFromUserInfoEndpoint = true;
});
我可以像这样获得索赔(带有完整的索赔列表):
但是,当我像这样修改responseType时,options.ResponseType = "id_token token";
的声明是这样的(只发出了少量声明):
如果我想在用户登录时同时获得完整的声明列表和访问令牌,我应该怎么做才能同时获得它们?
发布于 2019-03-13 11:57:06
默认情况下,如果访问令牌随访问令牌一起请求,IdentityServer将不会在身份令牌中提供用户声明。您可以在源代码here中看到这一点。要确保身份令牌始终包含用户声明(无论是否使用它请求访问令牌),需要在客户机上将AlwaysIncludeUserClaimsInIdToken
设置为true
。
发布于 2019-03-12 15:24:20
我看到您正在尝试使用文档中的一个示例。如果我错了,请纠正我。
如果不是,则将您的流更改为混合(这意味着ResponseType = "code id_token token"
)。在身份服务器端也要这样做。在作用域中还要添加openid
和profile
。然后,在列出索赔的地方,您可以使用(假设您正在使用razor页面列出它们):
@foreach (var claim in ((System.Security.Claims.ClaimsPrincipal)User).Claims)
{
<li>@claim.Type : @claim.Value</li>
}
这应该列出您拥有的所有声明(包括access_token本身)。
https://stackoverflow.com/questions/55115909
复制相似问题