如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api
Posted
技术标签:
【中文标题】如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api【英文标题】:How to add AzureAD AND AzureADBearer to asp.net core 2.2 web api 【发布时间】:2019-09-06 00:16:32 【问题描述】:我正在尝试创作一个网站,该网站使用 AzureAD 对用户进行身份验证以访问 UI 以创作数据库中的项目。而且我还希望其他服务可以通过不记名令牌调用此 API。
services.AddAuthentication(o =>
o.DefaultScheme = AzureADDefaults.BearerAuthenticationScheme;
o.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
)
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
我希望使用 AzureAD 方案对用户进行身份验证,但对相同 WEB API(在差异路由下)的服务由承载进行身份验证。或者拥有除两者之外的所有路线。两者都有效
【问题讨论】:
【参考方案1】:最终通过创建一个策略方案来解决这个问题,该方案根据存在的身份验证标头在两种模式之间切换:
// add azure ad user and service authentication
services
.AddAuthentication("Azures")
.AddPolicyScheme("Azures", "Authorize AzureAd or AzureAdBearer", options =>
options.ForwardDefaultSelector = context =>
var authHeader = context.Request.Headers["Authorization"].FirstOrDefault();
if (authHeader?.StartsWith("Bearer") == true)
return AzureADDefaults.JwtBearerAuthenticationScheme;
return AzureADDefaults.AuthenticationScheme;
;
)
.AddAzureADBearer(options => config.Bind("AzureAdBearer", options))
.AddAzureAD(options => config.Bind("AzureAd", options));
【讨论】:
这有帮助。快速无关的问题,在设置 ForwardDefaultSelector 后,如果 api 请求的非授权标头想要停止重定向到登录页面并返回 401。知道该怎么做吗? @Shubhan 返回 null 而不是 AzureADDefaults.AuthenticationScheme,当 authHeader 为 null 时,应该可以解决问题。 使用 Microsoft.Identity.Web 的新方法是什么?我用什么来代替AddAzureAD
和AddAzureADBearer
调用?【参考方案2】:
您可以将AddAzureADBearer
中间件添加到您的应用程序中:
services.AddAuthentication(sharedOptions =>
sharedOptions.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
sharedOptions.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
)
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAdBearer", options));
假设您的应用程序中有 api 控制器,如果另一个应用程序将访问受 AAD 保护的 web api,您应该设置架构:
[HttpGet]
[Authorize(AuthenticationSchemes = "AzureADBearer")]
public IEnumerable<string> Get()
return new string[] "value1", "value2" ;
【讨论】:
我倾向于在身份验证方案配置中使用前向选择器,而不是每次都指定方案。 这最终不起作用 - 为其中一种身份验证方案创建重定向循环并将 API 锁定到一个模式 使用这个给我这个错误::: Bearer error="invalid_token", error_description="签名无效" @Sid ,您是否更正了AddAzureADBearer
选项中的配置
使用 Microsoft.Identity.Web 的新方法是什么?我用什么来代替AddAzureAD
和AddAzureADBearer
调用?以上是关于如何将 AzureAD 和 AzureADBearer 添加到 asp.net core 2.2 web api的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中验证来自 AzureAD 的 JWT?
IdentityServer3 + AzureAD 和 RedirectUri 混淆
如何在后端 API 中验证 AzureAD accessToken
带有 Microsoft.Owin.Security.OpenIdConnect 和 AzureAD v 2.0 端点的自定义参数