Azure AD JWT实现Angular 4与.NET Core API认证问题咨询
解决Azure AD JWT令牌验证缺失密钥的问题
我来帮你搞定这个问题——其实.NET Core 2.0不需要手动配置Azure AD的JWT密钥,框架会自动从Azure AD的公开元数据端点获取密钥来验证令牌。你遇到的问题大概率是API的Azure AD认证配置没到位,下面是一步步的解决方法:
1. 先确认Azure AD中API应用的注册配置
登录Azure门户,找到你的Azure AD租户,先把API的应用注册捋清楚:
- 单独注册一个API类型的应用(和你的Angular客户端应用分开)
- 在API应用的「公开API」设置里,设置一个
应用ID URI(比如api://your-api-client-id),这个值要和后续API配置里的受众(Audience)完全一致 - 记好这个API应用的客户端ID和你的Azure AD租户ID,后面配置要用
2. 配置.NET Core 2.0 API的Azure AD认证
打开你的API项目,修改Startup.cs文件,按以下步骤配置:
第一步:添加Azure AD JWT认证服务
在ConfigureServices方法中添加认证逻辑:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; public void ConfigureServices(IServiceCollection services) { // 保留你原有的其他服务配置 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://login.microsoftonline.com/你的租户ID/v2.0"; options.Audience = "你的API应用的应用IDURI"; // 比如api://xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true // 这里不需要手动设置IssuerSigningKey,框架会自动从Authority的元数据端点拉取密钥 }; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_0); }
第二步:启用认证中间件
在Configure方法里,一定要让UseAuthentication在UseMvc之前执行:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // 保留你原有的其他中间件配置(比如异常处理、静态文件等) app.UseAuthentication(); // 这行必须在UseMvc前面 app.UseMvc(); }
3. 检查Angular客户端的令牌请求是否正确
你的Angular应用在获取JWT令牌时,要注意两个关键点:
- 请求的
scope必须包含API应用的应用ID URI加上.default(比如api://your-api-client-id/.default) - 获取到的令牌里,
aud(受众)声明要和API配置的Audience完全匹配
4. 测试认证效果
在API的控制器或具体方法上添加[Authorize]属性,比如:
[Authorize] [ApiController] [Route("api/[controller]")] public class YourController : ControllerBase { // 你的API接口方法 }
然后用Angular客户端携带正确的JWT令牌调用接口,就能验证认证是否生效了。
如果还是有问题,可以去Azure门户的App Service里开启「应用服务日志」,查看详细的认证错误日志,通常能快速定位是受众不匹配、颁发者错误还是令牌过期这类具体问题。
内容的提问来源于stack exchange,提问作者Rami
相关产品推荐
相关产品推荐

