最近我正在使用IdentityServer4进行SSO,当我调试代码时,我发现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;
});
我可以得到这样的声明(有完整的声明列表):但是,当我更改像这样的options.ResponseType = "id_token token";
响应类型声明是这样的(只发出一点声明):
如果我想在用户登录时同时拥有完整的声明列表和访问令牌,我该怎么做才能获得这两者?
默认情况下,如果同时请求访问令牌,IdentityServer将不会在身份令牌中提供用户声明。您可以在源代码here中看到这种情况。要确保身份令牌始终包含用户声明(无论是否请求访问令牌),请在客户端上将AlwaysIncludeUserClaimsInIdToken
设置为true
。
我看到您正在尝试使用文档中的一个示例。如我错了请纠正我。
如果没有那么 - 将你的流量改为Hybrid(这意味着ResponseType = "code id_token token"
)。在身份服务器端也这样做。对范围添加openid
和profile
。然后,在列出您的声明的地方,您可以使用(假设您使用剃刀页面列出它们):
@foreach (var claim in ((System.Security.Claims.ClaimsPrincipal)User).Claims)
{
<li>@claim.Type : @claim.Value</li>
}
这应列出您拥有的所有声明(包括access_token本身)。