【问题标题】:GetTokenAsync returns 2 audiences in ASP.NET Core 2.1 using auth0GetTokenAsync 使用 auth0 在 ASP.NET Core 2.1 中返回 2 个受众
【发布时间】:2019-01-18 20:39:19
【问题描述】:

我正在使用 ASP.NET Core 2.1 和 Auth0。

当我尝试检索访问令牌以访问我自己的 API 时,我使用

string accessToken = await HttpContext.GetTokenAsync("access_token");

奇怪的是,当我将令牌粘贴到 https://jwt.io/ 时,它显示已添加了一个观众。问题是不允许两个观众,因此令牌无效。添加的受众以 /userinfo 结尾

谁能解释一下为什么我的访问令牌中有两个受众?

我在 ConfigureServices 中使用以下代码

// Add authentication services
services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect("Auth0", options =>
{
    // Set the authority to your Auth0 domain
    options.Authority = $"https://{Configuration["Auth0:Domain"]}";

    // Configure the Auth0 Client ID and Client Secret
    options.ClientId = Configuration["Auth0:ClientId"];
    options.ClientSecret = Configuration["Auth0:ClientSecret"];

    // Set response type to code
    options.ResponseType = "code";

    // Configure the scope
    options.Scope.Clear();
    options.Scope.Add("openid");

    // Set the callback path, so Auth0 will call back to http://localhost:5000/signin-auth0
    // Also ensure that you have added the URL as an Allowed Callback URL in your Auth0 dashboard
    options.CallbackPath = new PathString("/signin-auth0");

    // Configure the Claims Issuer to be Auth0
    options.ClaimsIssuer = "Auth0";

    // Saves tokens to the AuthenticationProperties
    options.SaveTokens = true;

    options.Events = new OpenIdConnectEvents
    {
        // handle the logout redirection
        OnRedirectToIdentityProviderForSignOut = (context) =>
        {
            var logoutUri = $"https://{Configuration["Auth0:Domain"]}/v2/logout?client_id={Configuration["Auth0:ClientId"]}";

            var postLogoutUri = context.Properties.RedirectUri;
            if (!string.IsNullOrEmpty(postLogoutUri))
            {
                if (postLogoutUri.StartsWith("/"))
                {
                    // transform to absolute
                    var request = context.Request;
                    postLogoutUri = request.Scheme + "://" + request.Host + request.PathBase + postLogoutUri;
                }
                logoutUri += $"&returnTo={ Uri.EscapeDataString(postLogoutUri)}";
            }

            context.Response.Redirect(logoutUri);
            context.HandleResponse();

            return Task.CompletedTask;
        },
        OnRedirectToIdentityProvider = context =>
        {
            context.ProtocolMessage.SetParameter("audience", "MY_OWN_AUDIENCE_URL");

            return Task.FromResult(0);
        }    
    };
});

【问题讨论】:

  • 查看options.TokenValidationParameters 设置多个受众。
  • 但问题是我不想要多个观众。我只需要我自己的。
  • 您需要其他受众来检索用户的用户信息。
  • 我想我明白了。添加的受众是 auth0 管理 API?这意味着我需要配置多个受众?
  • 是的,它是 Auth0 添加的,用于授权客户端访问 Auth0 的 userinfo 端点。是的,您不应该使包含比您需要的更多受众的令牌无效。只需检查您需要的那些并忽略其余部分。

标签: c# asp.net-core auth0


【解决方案1】:

谁能解释一下为什么我的访问令牌中有两个受众?

第二个受众是 userinfo 端点。 userinfo endpoint is part of the OpenID Connect protocol;它公开了最终用户的个人资料信息,并且由于 openid 范围而存在。

当 Auth0 收到授权请求时,它会检查请求的 audiencescope 参数。如果audience 是自定义API,并且如果scope 包含openid,那么access_token 将包括两个受众:一个用于您的自定义API,另一个用于Auth0 userinfo 端点。

这是来自https://auth0.com/docs/tokens/access-token的支持引用

当受众设置为自定义 API 并且范围参数包含 openid 值时,生成的访问令牌将是一个 JWT,对检索用户的个人资料和访问自定义 API 均有效。此 JWT 的 aud 声明将包含两个值:YOUR_AUTH0_DOMAIN/userinfo 和您的自定义 API 的唯一标识符。

【讨论】:

  • 我觉得奇怪的是 Auth0 在 ASP.NET Core 2.x 教程中没有说明这一点。
  • 是的。这是不幸的。
【解决方案2】:

工作中

我使用 Startup 类中的 ConfigureServices 中的下一个代码让它工作。在来自配置的列表中,我放置了来自 Auth0 userinfo API 和我自己的 API 的受众。

// Multiple audiences
options.TokenValidationParameters = new TokenValidationParameters
{
    ValidateAudience = true,
    ValidAudiences = Configuration.GetSection("Auth0:Audiences").Get<List<string>>(),
    ValidateLifetime = true
};

【讨论】:

    猜你喜欢
    • 2019-08-15
    • 2020-12-05
    • 2019-03-08
    • 2019-03-21
    • 2020-08-10
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多