首页 > 解决方案 > 如何使用 AddJwtBearer 获取最新的用户信息

问题描述

我们使用 IdentityServer 在我们的应用程序中处理 SSO 身份验证。

我的应用程序是一个 Aspnet 核心 3.0 网站,它将用户令牌传递给 javascript。javascript 然后调用一个单独的 aspnet 2.2 API。

问题:注销用户并重新登录不会使用新声明更新 API 上的 ClaimsPrincipal。

我已确认 Web 应用程序具有新声明。

如果我以隐身方式登录或清除我的 cookie,新的声明会显示在 API 中。

我不确定获得索赔的责任应该在哪里以及如何解决。我假设声明是加密的 access_token 的一部分,因此我假设 Web 应用程序正在向 API 发送一个过时的 access_token。那么 Web App 是我需要修复的吗?什么是正确的解决方法?

API 启动代码

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = "Bearer";
                options.DefaultChallengeScheme = "Bearer";
            })
            .AddJwtBearer(options =>
            {
                options.Authority = oidcSettings.Authority;
                options.Audience = oidcSettings.ApplicationName;
                options.RequireHttpsMetadata = true;
            });

Web 应用程序启动代码

services.Configure<CookiePolicyOptions>(options =>
{
    options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
    options.OnAppendCookie = cookieContext => { cookieContext.CookieOptions.SameSite = SameSiteMode.None; };
    options.OnDeleteCookie = cookieContext =>
    {
        cookieContext.CookieOptions.SameSite = SameSiteMode.None; // this doesn't appear to get called.
    };
});

services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
}).AddCookie("Cookies", options =>
{
    options.SlidingExpiration = false;
    options.ExpireTimeSpan = TimeSpan.FromHours(8);
})
.AddOpenIdConnect("oidc", options =>
{
    options.Authority = oidcSettings.Authority;
    options.RequireHttpsMetadata = true;

    options.ClientId = oidcSettings.ClientId;
    options.ClientSecret = oidcSettings.ClientKey;
    options.ResponseType = OpenIdConnectResponseType.Code;

    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;

    options.Scope.Add("offline_access");
    options.Scope.Add(oidcSettings.ApplicationName);
    options.ClaimActions.MapJsonKey("role", "role"); // claims I am looking for are mapped here
    options.Events.OnUserInformationReceived = async (context) =>
    {
        await Task.CompletedTask; // confirmed that after new sign in I can see updated info here.
    };
});

TLDR:来自 Web 应用程序的 Javascript 使用 access_token 调用 Api。当用户注销并重新登录时,API 不会收到更新的声明。我不确定问题是 API 需要调用身份服务器以获取用户信息,还是 Web 应用程序未正确注销并需要发送新的 access_token?

标签: asp.net-coreidentityserver4

解决方案


推荐阅读