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

如何在ASP.NET Core中通过MSAL获取Azure AD V2.0的Refresh Token?

当然可以用MSAL在ASP.NET Core里搞定refresh token的事儿!其实MSAL已经把繁琐的手动调用/token端点的逻辑都封装好了,不用你自己去写那些请求,下面给你唠唠具体怎么操作:

在ASP.NET Core中使用MSAL获取并管理Refresh Token

1. 先把基础配置做对

首先得确保两件事:一是你的Azure AD应用注册用了支持refresh token的流程(比如授权码流,这是最常用的);二是请求的scope里必须包含*offline_access*——这个是核心,没有它的话Azure AD根本不会返回refresh token。

在你的appsettings.json里,要把scopes配置好:

"AzureAd": {
  "Instance": "https://login.microsoftonline.com/",
  "Domain": "your-domain.onmicrosoft.com",
  "TenantId": "your-tenant-id",
  "ClientId": "your-client-id",
  "ClientSecret": "your-client-secret",
  "Scopes": "user.read offline_access"
}

2. 让MSAL自动管理Token缓存

MSAL.NET会帮你自动处理refresh token的存储和刷新逻辑,你只需要正确配置token缓存就行。在ASP.NET Core里,开发阶段可以用内存缓存,生产环境建议换成分布式缓存(比如Redis)避免重启丢失缓存。

在Program.cs里注册MSAL服务:

builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches(); // 生产环境替换成AddDistributedTokenCaches()配合Redis

3. 调用API时自动用Refresh Token续期

当你需要调用Graph API的时候,完全不用手动管refresh token的事儿——MSAL会自动检查当前access token是否过期,如果过期了就自动用缓存里的refresh token去换全新的access token。

比如在控制器里注入ITokenAcquisition服务,然后调用方法获取token:

private readonly ITokenAcquisition _tokenAcquisition;

public YourController(ITokenAcquisition tokenAcquisition)
{
    _tokenAcquisition = tokenAcquisition;
}

public async Task<IActionResult> CallGraphApi()
{
    // MSAL自动处理token刷新,不用你操心refresh token
    string accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { "user.read" });
    
    // 用拿到的access token调用Graph API
    var graphClient = new GraphServiceClient(
        new DelegateAuthenticationProvider((requestMessage) =>
        {
            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            return Task.CompletedTask;
        }));
    
    var userInfo = await graphClient.Me.GetAsync();
    return Ok(userInfo);
}

4. 特殊场景:手动获取Refresh Token

如果你确实有自定义需求(比如自己存储token),可以通过AuthenticationResult对象拿到refresh token——第一次获取token的时候,这个对象里就包含RefreshToken属性:

var authResult = await _tokenAcquisition.GetAuthenticationResultForUserAsync(new[] { "user.read", "offline_access" });
string refreshToken = authResult.RefreshToken;

不过还是建议尽量让MSAL自动管理,因为Azure AD每次用refresh token换token时都会返回新的refresh token,MSAL会自动处理这种轮换逻辑,手动处理容易出问题。

几个要注意的点

  • 千万别忘了加*offline_access* scope,不然拿不到refresh token。
  • 生产环境别用内存缓存,应用一重启用户就得重新登录。
  • MSAL会自动处理token的过期和刷新,除非特殊需求,别手动去调用/token端点。

内容的提问来源于stack exchange,提问作者S. Anna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:58:03