Oauth 如何设置oidc ResponseType以获取声明和访问令牌?

Oauth 如何设置oidc ResponseType以获取声明和访问令牌?,oauth,openid,identityserver4,openid-connect,Oauth,Openid,Identityserver4,Openid Connect,最近,我正在使用IdentityServer4处理一个SSO,当我调试代码时,我发现ResponseType设置会导致一个棘手的问题。 当我这样设置我的客户机时: JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(options => { options.DefaultScheme = "Cookies";

最近,我正在使用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;
            });
我可以得到这样的索赔(完整的索赔清单): 但是当我像这样更改responseType
options.responseType=“id\u token token”
索赔如下(仅发布了少量索赔):


如果我在用户登录时同时需要完整的声明列表和访问令牌,我应该如何获得它们?

我看到您正在尝试使用文档中的一个示例。如果我错了,请纠正我

如果没有,那么-将流更改为Hybrid(这意味着
ResponseType=“code id\u token token”
)。在identity server端也可以这样做。在作用域中还添加
openid
profile
。然后,在列出索赔的地方,您可以使用(假设您正在使用razor页面列出索赔):

@foreach(var claim in((System.Security.Claims.ClaimsPrincipal)User.Claims)
{
  • @claim.Type:@claim.Value
  • }

    这应该列出您拥有的所有声明(包括访问令牌本身)。

    默认情况下,如果同时请求访问令牌,IdentityServer将不会在标识令牌中提供用户声明。您可以在源代码中看到这种情况。
    要确保标识令牌始终包含用户声明(无论是否请求访问令牌),请在客户端上将其设置为
    true

    对于上面定义的客户机,您有
    options.ResponseType=“id\u token token”
    ,并且是您所需的设置。您的意思是要将其中一个更改为其他值吗?抱歉,是的,我将“id_令牌”更改为“id_令牌”,然后我得到的索赔比以前少。检查identity server后,我发现索赔已发出,但客户端未收到。您好,当使用“id_令牌”作为响应类型时,它适用于我。当我将响应类型更改为“id_token token”时,声明消失,然后出现access_token…我真的搞不懂为什么会发生这种情况。@Ternence.Lin-现在我看到了您的问题。好吧,索赔就在那里。它们只是编码在
    访问\u令牌中。尝试在
    jwt.io
    中解码它,您将看到它们。还有一件事-你有没有尝试添加我在你的页面上显示的行?
    @foreach (var claim in ((System.Security.Claims.ClaimsPrincipal)User).Claims)
    {
        <li>@claim.Type : @claim.Value</li>
    }