Asp.net core 如何使用AddJwtBearer获取更多最近的用户信息

Asp.net core 如何使用AddJwtBearer获取更多最近的用户信息,asp.net-core,identityserver4,Asp.net Core,Identityserver4,我们使用IdentityServer跨应用程序处理SSO身份验证 我的应用程序是一个Aspnet core 3.0网站,它将用户令牌传递给javascript。javascript然后调用一个单独的aspnet 2.2 API 问题:注销和重新登录用户不会使用新声明更新API上的ClaimsPrincipal。 我已经确认Web应用程序具有新的声明 如果我以匿名方式登录或清除cookies,新的声明将显示在API中 我不确定获得索赔的责任应该在哪里,以及如何解决。我假设声明是加密的访问令牌的一部

我们使用IdentityServer跨应用程序处理SSO身份验证

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

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

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

如果我以匿名方式登录或清除cookies,新的声明将显示在API中

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

Api启动代码

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = "Bearer";
                options.DefaultChallengeScheme = "Bearer";
            })
            .AddJwtBearer(options =>
            {
                options.Authority = oidcSettings.Authority;
                options.Audience = oidcSettings.ApplicationName;
                options.RequireHttpsMetadata = true;
            });
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.
    };
});
Web应用启动代码

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = "Bearer";
                options.DefaultChallengeScheme = "Bearer";
            })
            .AddJwtBearer(options =>
            {
                options.Authority = oidcSettings.Authority;
                options.Audience = oidcSettings.ApplicationName;
                options.RequireHttpsMetadata = true;
            });
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.
    };
});
services.Configure(选项=>
{
options.MinimumSameSitePolicy=SameSiteMode.Unspecified;
options.OnAppendCookie=cookieContext=>{cookieContext.CookieOptions.SameSite=SamesItemMode.None;};
options.OnDeleteCookie=cookieContext=>
{
cookieContext.CookieOptions.SameSite=SamesItemMode.None;//这似乎没有被调用。
};
});
services.AddAuthentication(选项=>
{
options.DefaultScheme=“Cookies”;
options.DefaultChallengeScheme=“oidc”;
}).AddCookie(“Cookies”,选项=>
{
options.SlidingExpiration=false;
options.ExpireTimeSpan=TimeSpan.FromHours(8);
})
.AddOpenIdConnect(“oidc”,选项=>
{
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(“脱机访问”);
options.Scope.Add(oidcSettings.ApplicationName);
options.claiments.MapJsonKey(“角色”、“角色”);//我要查找的索赔映射到这里
options.Events.onUserInformation Received=异步(上下文)=>
{
wait Task.CompletedTask;//确认在新登录后,我可以在此处看到更新的信息。
};
});

TLDR:Web应用程序中的Javascript使用access\u令牌调用Api。当用户注销并重新登录时,API不会收到更新的声明。我不确定问题是API需要调用identity server获取用户信息,还是Web应用没有正确注销,需要发送新的访问令牌?

“API上的ClaimsPrincipal”:此主体包含访问令牌中的信息。如果您可以在类似的网站上检查令牌,那么很可能这些声明确实不是令牌的一部分。问题是,你们遗漏了什么索赔?请注意,并非所有声明都指向访问令牌。Perhas和答案可以帮助你。谢谢。我使用了这个jwt.io站点,看起来access_令牌缺少新的声明,但是令牌上的身份验证时间是正确的。因此,我假设问题出在IdentityServer中。如果我清除cookies,则访问令牌具有新声明。您在哪里清除cookies的?在IdentityServer网站上的“API上的ClaimsPrincipal”:此主体包含访问令牌的信息。如果您可以在类似的网站上检查令牌,那么很可能这些声明确实不是令牌的一部分。问题是,你们遗漏了什么索赔?请注意,并非所有声明都指向访问令牌。Perhas和答案可以帮助你。谢谢。我使用了这个jwt.io站点,看起来access_令牌缺少新的声明,但是令牌上的身份验证时间是正确的。因此,我假设问题出在IdentityServer中。如果我清除cookies,则访问令牌具有新声明。您在哪里清除cookies的?在IdentityServer网站上?