401 使用 Azure AD 在 .NET Core 3.1 中仅使用不记名令牌进行身份验证
Posted
技术标签:
【中文标题】401 使用 Azure AD 在 .NET Core 3.1 中仅使用不记名令牌进行身份验证【英文标题】:401 with bearer token only auth in .NET Core 3.1 using Azure AD 【发布时间】:2020-08-12 09:01:59 【问题描述】:我正在尝试使用 Azure AD 在 .NET Core 3.1 API 中实现不记名令牌(仅)身份验证。
在验证 authorization_code
后,我能够从 Azure AD 中检索令牌,并且浏览器将返回到我的重定向 URL,其中包含以下内容:
"token_type":"Bearer","scope":"User.Read","expires_in":3600,"ext_expires_in":3600,"access_token":"EwBwA8l6...SzT3qoxGbSMg=="
(缩短)
拥有此令牌后,我是否可以直接在我的 API 上使用 [Authorize]
属性并在标头中使用不记名令牌进行请求?当我这样做时,我会收到 401 响应。
我的ConfigureServices()
中有这个:
services.AddAuthentication(options =>
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
)
.AddJwtBearer(options =>
options.Audience = "<guid>";
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
ValidateIssuerSigningKey = false,
ValidateAudience = false,
ValidateIssuer = false,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abc123")),
TokenDecryptionKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abc123"))
;
);
services.AddControllers();
在Configure()
我有:
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
endpoints.MapControllerRoute(
name: "default",
pattern: "controller=Home/action=Index/id?");
);
在我的错误日志中,我看到的消息是:
“承载者”未通过身份验证。失败消息:“没有可用于令牌的 SecurityTokenValidator
我在 Startup.cs 中尝试了很多很多设置组合,但无论如何,当从 Postman 调用我的 API 时,我似乎只能得到 401。我可以使用我在网上找到的代码示例进行 Cookie 身份验证,但我不希望这样。
是令牌被加密的问题吗?我是否尝试使用错误的令牌?还是有其他问题?我是否需要在我的应用程序中使用 AspNetUser 等的数据库表设置身份?
简而言之,我只是尝试使用 Azure AD 作为身份验证提供程序生成不记名令牌,并通过传入不记名令牌标头来调用我的 API。
【问题讨论】:
【参考方案1】:看起来有点像您正在尝试在 API 中使用 Microsoft Graph API 令牌。 (基于此:"scope":"User.Read"
)
您的前端应用需要为您的 API 使用范围,而不是 User.Read。 这样,它将获得一个用于您的 API 的访问令牌。 通过公开 API 部分在您的 API 应用注册上注册一个范围,并在获取令牌时在您的前端使用完整的范围值。
您的后端需要以下配置:
.AddJwtBearer(options =>
// add v2.0 to the end if your API is set to get v2 tokens in its manifest
options.Authority = "https://login.microsoftonline.com/your-aad-tenant-id";
options.Audience = "your-api-client-id";
);
这应该是身份验证所需的最低配置。 它会在启动时自动从权威机构查找签名密钥等。
【讨论】:
谢谢。我添加了那个范围,重定向现在产生"token_type":"Bearer","scope":"api://[guid]/Skills.Read","expires_in":3600,"ext_expires_in":3600,"access_token":"ey...xfdf="
。将该令牌放入请求标头中时,出现错误:签名验证失败。无法匹配键。
您是否将权限更新到您在前端使用的 AAD 租户? :)
对不起,我想你把我弄丢了。 :\
我的意思是在您的后端身份验证配置中,您是否使用您的租户 ID 设置了授权?并删除令牌验证参数?
哦!我想我现在明白了。我更新了授权 URL,一旦我这样做了,我就收到了一个关于发行者无效的错误。我设置了 ValidateIssuer=false 并且有效(我会解决这个问题,但我只是想让它工作。)非常感谢!以上是关于401 使用 Azure AD 在 .NET Core 3.1 中仅使用不记名令牌进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
401- 使用 REST API Dynamics CRM 和 Azure AD 进行未经授权的身份验证
Azure AD - HTTP/1.1 401 未经授权 - Windows 服务
Azure AD,客户端机密应用程序调用具有自定义应用程序 ID URI 的 web api,返回 401
Angular MSAL AD 401 在 Angular 应用程序中未经授权,但在 Postman 中 200 正常 - ASP.NET Core Web API