如何在.Net Core 2.0控制器中获取Azure Bearer令牌?附Startup.cs配置代码
在.NET Core 2.0控制器中获取Azure Bearer令牌的实现指导
没问题,我来给你梳理下完整的实现步骤,结合你已有的Startup配置来调整:
一、先完善Startup.cs中的Azure AD身份验证配置
你提供的代码片段有点不完整,我先帮你补全并修正,确保配置能正常工作:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.AzureAD.UI; // 在ConfigureServices方法中 services.AddAuthentication(sharedOptions => { sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddAzureAdBearer(configureOptions => { configureOptions.Instance = Environment.GetEnvironmentVariable("AD_Instance"); configureOptions.Domain = Environment.GetEnvironmentVariable("AD_Domain"); configureOptions.TenantId = Environment.GetEnvironmentVariable("AD_TenantId"); configureOptions.ClientId = Environment.GetEnvironmentVariable("AD_ClientId"); // 可选:如果需要指定受众,这里可以设置为你的ClientId,不过AddAzureAdBearer通常会自动处理 // configureOptions.Audience = configureOptions.ClientId; }); // 别忘了在Configure方法中启用身份验证中间件,它需要放在UseMvc之前 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // ...其他中间件(比如UseStaticFiles、UseErrorHandling等) app.UseAuthentication(); app.UseMvc(); }
二、在控制器中获取Bearer令牌
有几种实用的方式可以拿到请求中的Bearer令牌,根据你的需求选就行:
1. 直接从HttpContext的请求头提取
这是最直接的方式,在控制器的Action里就能拿到:
[Authorize] // 一定要加这个特性,确保只有授权请求能访问 [ApiController] [Route("api/[controller]")] public class MyController : ControllerBase { [HttpGet("retrieve-token")] public IActionResult RetrieveToken() { var authHeader = Request.Headers["Authorization"].ToString(); if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Bearer ")) { // 去掉"Bearer "前缀,拿到原始令牌 var bearerToken = authHeader.Substring("Bearer ".Length).Trim(); return Ok(new { BearerToken = bearerToken }); } return BadRequest("请求中未携带有效的Bearer令牌"); } }
2. 通过User属性获取令牌中的用户信息(如果不需要原始令牌)
如果你只是需要令牌里的用户声明(比如用户ID、姓名),直接用控制器自带的User属性就行,不用手动解析令牌:
[HttpGet("user-details")] public IActionResult GetUserDetails() { var userId = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value; var userName = User.FindFirst(System.Security.Claims.ClaimTypes.Name)?.Value; var email = User.FindFirst(System.Security.Claims.ClaimTypes.Email)?.Value; return Ok(new { UserId = userId, UserName = userName, Email = email }); }
3. 在非控制器类中获取令牌(比如服务类)
如果需要在业务服务类里拿到令牌,可以通过IHttpContextAccessor来实现:
首先在Startup.cs的ConfigureServices里注册这个服务:
services.AddHttpContextAccessor();
然后在你的服务类中注入并使用:
public class MyBusinessService { private readonly IHttpContextAccessor _httpContextAccessor; public MyBusinessService(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public string GetCurrentBearerToken() { var httpContext = _httpContextAccessor.HttpContext; if (httpContext == null) return null; var authHeader = httpContext.Request.Headers["Authorization"].ToString(); if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Bearer ")) { return authHeader.Substring("Bearer ".Length).Trim(); } return null; } }
三、关键注意事项
- 务必确保
UseAuthentication()中间件在UseMvc()之前注册,否则身份验证不会生效。 - 环境变量的取值要正确:
AD_Instance一般是https://login.microsoftonline.com/,AD_TenantId可以是你的Azure AD租户GUID或者域名。 - 只有携带有效Azure AD令牌的请求才能通过
[Authorize]验证,无效令牌会被框架自动拦截并返回401 Unauthorized。
内容的提问来源于stack exchange,提问作者Saso
相关产品推荐
相关产品推荐

