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

如何在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:20:49