asp.net-core - 如何使用 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?
解决方案
推荐阅读
- spring - aspectj 注释不适用于 flink
- python - 为什么我的 django 项目在域中不可见,但从服务器 IP 地址访问时工作正常?
- mysql - hibernate 抛出意外的令牌:(在使用 sql 的查询(包括子查询)的第 1 行附近出现异常
- php - 抱歉,您不能以该用户的身份使用 curl request php 创建帖子
- android - Android:Fragment 中的 getArguments() 返回 null,即使我在 newInstance() 中设置了 Arguments()
- php - 在无对数组的情况下,如何有效地求和成对数组元素并避免偏移错误?
- intellij-idea - 如何在 Intellij 中只运行单个 kotlin 文件
- python - 使用 pandas.duplicated 函数显示重复值
- next.js - Next.js Azure 媒体播放器警告:预期的服务器 HTML 包含匹配
- php - 会话未在 PHP 7.4 中启动,但相同的代码在 PHP 7.1 中有效,无需进行任何更改