【问题标题】:How to set oidc ResponseType to get both claims and access_token?如何设置 oidc ResponseType 来获取声明和 access_token?
【发布时间】:2019-08-02 14:19:04
【问题描述】:

最近我正在使用 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_token token"; 索赔是这样的(只发出了一点索赔):

如果我在用户登录时想要完整的声明列表和访问令牌,我应该怎么做才能获得它们?

【问题讨论】:

  • 您有options.ResponseType = "id_token token" 用于上面定义的客户端并作为您想要的设置。您的意思是要将其中一个更改为不同的值吗?
  • 对不起,是的,我从“id_token”更改为“id_token token”,然后我收到的索赔比以前少了。检查身份服务器后,我发现索赔已经发出,但客户端没有收到。

标签: oauth openid identityserver4 openid-connect


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果不是那么 - 将您的流程更改为 Hybrid(这意味着 ResponseType = "code id_token token")。在身份服务器端也这样做。在作用域中还要添加openidprofile。然后,在您列出您的声明的地方,您可以使用(假设您使用剃刀页面来列出它们):

    @foreach (var claim in ((System.Security.Claims.ClaimsPrincipal)User).Claims)
    {
        <li>@claim.Type : @claim.Value</li>
    }
    

    这应该列出您拥有的所有声明(包括 access_token 本身)。

    【讨论】:

    • 嗨,当使用“id_token”作为响应类型时,它适用于我。当我将响应类型更改为“id_token token”时,声明消失然后出现 access_token ......我真的很困惑为什么会发生......
    • @Ternence.Lin - 现在我看到了你的问题。那么索赔就在那里。它们只是在access_token 中编码。尝试在jwt.io 中解码它,你会看到它们。还有一件事 - 您是否尝试在您的页面中添加我向您展示的行?
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 2022-11-30
    • 2018-08-01
    • 2018-08-20
    • 2016-10-17
    • 1970-01-01
    • 2020-03-31
    • 2021-09-09
    相关资源
    最近更新 更多