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

.NET Core应用登录后如何获取Authorization Code初始化Microsoft Graph客户端

如何在用户登录后获取Authorization Code并初始化Microsoft Graph客户端?

问题描述

我有一段初始化Microsoft Graph客户端的代码,逻辑很清晰,但其中需要用到用户的Authorization Code。我在调试时能看到用户登录过程中生成的授权码,但这段代码要放到工具类里,而且只能在用户登录应用之后调用。请问怎么在用户登录后读取到这个授权码,并用它来初始化Graph客户端?

原代码示例:

using Microsoft.Graph; 
using Azure.Identity;

var scopes = new[] { "https://{tenant-name}.sharepoint.com/.default" };
var tenantId = "tenant id";
var clientId = "client id";
var clientSecret = "client secret";

// 这里不知道怎么获取用户登录后的授权码
var authorizationCode = "authorization code "; 

var options = new TokenCredentialOptions
{
    AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};

var authCodeCredential = new AuthorizationCodeCredential(
    tenantId, clientId, clientSecret, authorizationCode, options);

var accessToken = await authCodeCredential.GetTokenAsync(new Azure.Core.TokenRequestContext(scopes) { });
Console.WriteLine(accessToken.Token);
  
//var graphClient = new GraphServiceClient(authCodeCredential, scopes);

解决方案

1. 先在登录回调中捕获并存储授权码

用户通过Microsoft身份平台登录后,授权服务器会将授权码通过回调URL的code查询参数返回给你的应用。你需要在处理回调的代码中先捕获这个授权码,并存到用户会话或安全缓存中,供后续工具类调用:

比如在ASP.NET Core的回调Controller中:

public async Task<IActionResult> AuthCallback(string code, string state)
{
    // 验证state参数,防止CSRF攻击(state是你发起登录请求时生成的随机值)
    if (!string.Equals(state, HttpContext.Session.GetString("LoginState")))
    {
        return BadRequest("请求状态无效");
    }

    // 将授权码存入用户会话,后续工具类可以从这里读取
    HttpContext.Session.SetString("UserAuthorizationCode", code);

    // 完成登录流程,跳转到应用主页
    return RedirectToAction("Index", "Home");
}

2. 在工具类中读取授权码并初始化Graph客户端

在工具类中,通过IHttpContextAccessor访问用户会话,取出之前存储的授权码,再初始化AuthorizationCodeCredential和Graph客户端。注意:授权码只能使用一次,AuthorizationCodeCredential会自动将其交换为访问令牌和刷新令牌,后续调用Graph时会自动刷新令牌,无需重复使用授权码。

修改后的工具类示例:

using Microsoft.Graph;
using Azure.Identity;
using Microsoft.AspNetCore.Http;

public class GraphClientUtility
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    // 通过依赖注入获取HttpContextAccessor,用于访问用户会话
    public GraphClientUtility(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public async Task<GraphServiceClient> GetAuthenticatedGraphClientAsync()
    {
        var scopes = new[] { "https://{tenant-name}.sharepoint.com/.default" };
        var tenantId = "你的租户ID";
        var clientId = "你的客户端ID";
        var clientSecret = "你的客户端密钥";

        // 从用户会话中读取授权码
        var authCode = _httpContextAccessor.HttpContext.Session.GetString("UserAuthorizationCode");
        if (string.IsNullOrWhiteSpace(authCode))
        {
            throw new InvalidOperationException("用户未完成登录,无法获取授权码");
        }

        var credentialOptions = new TokenCredentialOptions
        {
            AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
        };

        var authCredential = new AuthorizationCodeCredential(
            tenantId, clientId, clientSecret, authCode, credentialOptions);

        // 初始化并返回Graph客户端
        return new GraphServiceClient(authCredential, scopes);
    }
}

关键注意事项

  • 授权码的有效期很短(通常10分钟)且只能使用一次,所以必须在用户登录后立即捕获并处理。
  • 会话存储要确保安全,建议启用HTTPS,同时合理设置会话超时时间。
  • 如果是桌面/移动应用,获取授权码的方式会不同(比如使用嵌入式浏览器),但核心逻辑都是捕获回调返回的code参数后再初始化凭证。

内容的提问来源于stack exchange,提问作者Andrew Casey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:40