在 ASP.NET MVC 中过期后刷新访问令牌

Posted

技术标签:

【中文标题】在 ASP.NET MVC 中过期后刷新访问令牌【英文标题】:Refresh access token after expiry in ASP.NET MVC 【发布时间】:2021-12-05 11:09:00 【问题描述】:

我正在使用 Open ID 连接混合流在 ASP.NET MVC 应用程序中获取访问令牌。并使用此访问令牌调用 Power BI Rest API。但是,一旦访问令牌过期,REST API 调用就会因明显原因而失败。

我的问题是如何在不推送用户进行交互式登录的情况下获取新的访问令牌/刷新?

  public void ConfigureAuth(IAppBuilder app)
    
        try
        
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                
                    ClientId = clientId,
                    Authority = authority,
                    PostLogoutRedirectUri = postLogoutRedirectUri,
                    RedirectUri = redirectUri,
                    UseTokenLifetime = false,
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    
                        AuthenticationFailed = context =>
                        
                            context.HandleResponse();
                            context.Response.Redirect("/Error?message=" + context.Exception.Message);
                            return Task.FromResult(0);
                        ,
                        AuthorizationCodeReceived = OnAuthorizationCodeCallback
                    
                );

            app.UseStageMarker(PipelineStage.Authenticate);
        
        catch (Exception ex)
        
            throw new Exception(ex.Message);
        
    

    private static async Task OnAuthorizationCodeCallback(AuthorizationCodeReceivedNotification context)
    
        var appConfidential = ConfidentialClientApplicationBuilder.Create(clientId)
                                             .WithRedirectUri(redirectUri)
                                             .WithClientSecret(clientSecret)
                                             .WithAuthority(authority)
                                             .Build();

        string powerBiPermissionApi = "https://analysis.windows.net/powerbi/api/";
        string[] ReadUserWorkspaces = new string[] 
            powerBiPermissionApi + "Workspace.Read.All",
            powerBiPermissionApi + "Report.Read.All",
            powerBiPermissionApi + "Dashboard.Read.All",
            powerBiPermissionApi + "Dataset.Read.All"
        ;

        var authResult = await appConfidential.AcquireTokenByAuthorizationCode(ReadUserWorkspaces, context.Code).ExecuteAsync();
        ClaimsIdentity userClaims = context.AuthenticationTicket.Identity;
        userClaims.AddClaim(new Claim("Access_Token", authResult.AccessToken));
    

【问题讨论】:

你能获得刷新令牌吗?如果是这样,这是在这样的服务器端应用程序中进行令牌更新的推荐机制。 【参考方案1】:

使用 Azure Active Directory,我们可以为测量天数指定我们自己的自定义超时/将会话长度与令牌有效性解耦。

我发现的一种方法是将会话持续时间与原始令牌的到期时间分开。通过向 OIDC 中间件提供以下选项,您可以告诉它停止在 cookie 中间件中控制此方面:

app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions 
 ... 
UseTokenLifetime = false, 
 
 );

如果 UseTokenLifetime 设置为 false,cookie 中间件现在将遵循您在 cookie 中间件参数中提供的任何设置。

或者,我们可以使用每 5 分钟更新一次的页面中的 iFrame。

<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" id="refreshAuthenticationIframe" src="@Url.Action("CheckSessionTimeout", "Home", new  area = "" )" style="display:none;"></iframe>

您可以通过此Thread 找到更多详细信息。

参考:

    Controlling a Web App’s session duration – CloudIdentity Solved: How to use Power BI Rest API without GUI authentic... - Microsoft Power BI Community

【讨论】:

如果我的答案对您有用,您可以接受它作为答案(单击答案旁边的复选标记,将其从灰色切换为填写)。这对其他社区成员可能是有益的。谢谢

以上是关于在 ASP.NET MVC 中过期后刷新访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net 中生成刷新令牌?

ASP .NET Web Api OAuth 刷新令牌过期时间

ASP.NET Core Web Api之JWT刷新Token

过期后使用刷新令牌获取访问令牌(JWT)

如何从刷新令牌中获取访问令牌?刷新令牌会过期吗?

Keycloak:ajax调用过期后刷新访问令牌