You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OBO流程时刷新过期Access Token的问题

解决OBO流程中令牌过期问题的方案
  • 核心逻辑:MSAL.NET在OBO(代表用户获取令牌)流程中会自动管理Refresh Token缓存,无需手动暴露或处理,关键要保证客户端实例复用与权限配置正确。

具体解决步骤:

  1. 复用ConfidentialClientApplication实例
    你当前的代码每次调用都重新创建ConfidentialClientApplication实例,会导致MSAL无法复用缓存的Refresh Token。需将该实例注册为单例(比如在ASP.NET Core中通过依赖注入配置),确保应用生命周期内使用同一个实例,让MSAL能维护令牌缓存。

    修正后的实例注册方式(ASP.NET Core为例):

    // 在Program.cs中注册单例
    builder.Services.AddSingleton<IConfidentialClientApplication>(sp =>
    {
        var configuration = sp.GetRequiredService<IConfiguration>();
        return ConfidentialClientApplicationBuilder
            .Create(configuration["AzureAd:ClientId"])
            .WithAuthority(configuration["AzureAd:Authority"])
            .WithClientSecret(configuration["AzureAd:ClientSecret"])
            .WithTenantId(configuration["AzureAd:TenantId"])
            .Build();
    });
    
  2. 无需手动处理Refresh Token
    MSAL.NET不会直接暴露Refresh Token,但会自动在缓存中存储并使用它。再次调用AcquireTokenOnBehalfOf时,MSAL会自动检查缓存:

    • 若存在未过期的Access Token,直接返回;
    • 若Access Token过期但Refresh Token有效,自动用Refresh Token获取新的Access Token;
    • 仅当Refresh Token也过期时,才需要重新获取用户断言。
  3. 确认权限配置有效性
    你已添加offline_access scope(这是获取Refresh Token的必要条件),需确保API应用在Azure AD中已配置对应权限,且管理员已完成权限同意(若为租户级权限)。

调用示例

注入单例IConfidentialClientApplication后,调用代码可保持简洁:

public async Task<AuthenticationResult> GetOboTokenAsync(string accessToken, string[] scopes)
{
    var userAssertion = new UserAssertion(accessToken);
    var result = await _confidentialClientApplication.AcquireTokenOnBehalfOf(scopes, userAssertion)
        .ExecuteAsync();
    return result;
}

内容的提问来源于stack exchange,提问作者Liam Kenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:05:08