.NET Core应用登录后如何获取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
相关产品推荐
相关产品推荐

