使用ASP.NET Core 3.1和OpenIDConnect,我能够进行身份验证,并在流程中添加用户声明,例如,授予资源访问权限的用户角色。
如果我在运行时改变了用户的“角色”,我不想让用户登出,而是希望强制令牌被刷新,并拥有新的声明/角色。
目前,我正在使用此options.Events.OnTokenValidated = async context => { /* add claims if authenticated */}最初添加索赔。
我添加了中间件来检测用户是否有新的“角色”,并希望强制事件再次触发。
处理这个问题的正确方法是什么?
发布于 2021-03-25 21:09:21
您可以在每次刷新访问令牌时更新它的内容,并且可以通过将UpdateAccessTokenClaimsOnRefresh标志设置为true来启用它。请参阅文档here。
问题是,在数据库中的更改和刷新访问令牌之间,您可以接受多大的“延迟”。
如果要更新客户端中的用户,则必须使用AddCookie处理程序中的一个事件。仅当用户首次登录时,才涉及AddOpenIDConnect处理程序。在此之后,AddCookie负责并拥有用户对象(ClaimsPrincipal)。
发布于 2021-03-27 16:16:13
我有两个解决方案,而且都不是很理想。
当您使用Ajax调用时,第一个不起作用。(我收到CORS错误,并且找不到允许主机的方法;印前检查调用失败。)
// middleware
public async Task Invoke(HttpContext context) {
if (userRolesHaveChanged) {
context.ChallengeAsync(OpenIdConnectDefaults.AuthenticationScheme,
new AuthenticationProperties { RedirectUri = redirectUrl });
return;
}
// the normal flow
await next(context);
}CORS策略阻止了从源'https://localhost:8083‘对位于'https://login.microsoftonline.com/XYZ/oauth2/v2.0/authorize?client_id=xyz&redirect_uri=https%3A%2F%2Flocalhost%3A8083%2FAuth%2FLogin%2FSignInOidc&response_type=id_token&/x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.5.0.0’(从'https://localhost:8083/ PATH‘重定向)的XMLHttpRequest的CORS访问:对印前检查请求的响应未通过访问控制检查:请求的资源上不存在' access - control -Allow- origin’标头。
为了克服CORS问题,我想出了一个办法,利用Cookie的过期时间。
首先配置OpenIdConnect以利用cookie过期时间,然后当用户角色发生更改时,只需删除控制cookie。
// startup
services.Configure<OpenIdConnectOptions> (OpenIdConnectDefaults.AuthenticationScheme, options =>
options.UseTokenLifetime = false; // Expire time
options.SignInScheme = "hack";
// SNIPPED CODE
.AddCookie("hack", "hack", options =>
{
const int minute = 60;
const int hour = minute * 60;
const int day = hour * 24;
options.ExpireTimeSpan = TimeSpan.FromSeconds(day/2.0);
})然后在中间件中
// middleware
public async Task Invoke(HttpContext context) {
if (userRolesHaveChanged) {
// force expire....
// causes the next page load to indirectly call ChallengeAsync
context.Response.Cookies.Delete(".AspNetCore.hack");
// also possibly set some other controlling variable,
// and deal with it, within the Ajax call
// e.g.
context.Response.Cookies.Append("autoSignIn", redirectUrl,
new CookieOptions { HttpOnly = false });
}这个解决方案既糟糕又笨拙。
https://stackoverflow.com/questions/66798323
复制相似问题