首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASP.NET Core 3.1 OpenIDConnect,如何在不注销用户的情况下更新申请

ASP.NET Core 3.1 OpenIDConnect,如何在不注销用户的情况下更新申请
EN

Stack Overflow用户
提问于 2021-03-25 19:13:33
回答 2查看 90关注 0票数 0

使用ASP.NET Core 3.1OpenIDConnect,我能够进行身份验证,并在流程中添加用户声明,例如,授予资源访问权限的用户角色。

如果我在运行时改变了用户的“角色”,我不想让用户登出,而是希望强制令牌被刷新,并拥有新的声明/角色。

目前,我正在使用此options.Events.OnTokenValidated = async context => { /* add claims if authenticated */}最初添加索赔。

我添加了中间件来检测用户是否有新的“角色”,并希望强制事件再次触发。

处理这个问题的正确方法是什么?

EN

回答 2

Stack Overflow用户

发布于 2021-03-25 21:09:21

您可以在每次刷新访问令牌时更新它的内容,并且可以通过将UpdateAccessTokenClaimsOnRefresh标志设置为true来启用它。请参阅文档here

问题是,在数据库中的更改和刷新访问令牌之间,您可以接受多大的“延迟”。

如果要更新客户端中的用户,则必须使用AddCookie处理程序中的一个事件。仅当用户首次登录时,才涉及AddOpenIDConnect处理程序。在此之后,AddCookie负责并拥有用户对象(ClaimsPrincipal)。

票数 0
EN

Stack Overflow用户

发布于 2021-03-27 16:16:13

我有两个解决方案,而且都不是很理想。

当您使用Ajax调用时,第一个不起作用。(我收到CORS错误,并且找不到允许主机的方法;印前检查调用失败。)

代码语言:javascript
复制
// 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。

代码语言:javascript
复制
// 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);
                })

然后在中间件中

代码语言:javascript
复制
// 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 });
        }

这个解决方案既糟糕又笨拙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66798323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档