所以,这困扰了我一段时间。我已经采取了变通方法以使其正常工作,但我真的很想知道这是否可行...
我有一个.NET Core 2.2 MVC App,其中包含一些API控制器以及常规的MVC控制器和视图。
最终目标是拥有一个Azure Function应用程序来针对API端点运行计划的任务,并使用户能够登录和使用该应用程序。阅读受管服务身份表明,我可以使用服务凭据来使功能应用程序向API控制器进行身份验证,因此我们不必在功能应用程序中保存用户凭据。
用户通过我们的Azure AD登录,此部分工作正常。我还希望使用JWT(Authorize: Bearer ....
)
我似乎能够配置Azure AD身份验证或JWT身份验证,但不能同时配置。关于如何实现这一目标的任何想法?
这是Startup.cs配置身份验证的一部分:
public void ConfigureServices(IServiceCollection services)
{
// ... just some non interesting bits removed
services.AddAuthentication(config =>
{
config.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
config.DefaultChallengeScheme = AzureADDefaults.AuthenticationScheme;
config.DefaultAuthenticateScheme = AzureADDefaults.AuthenticationScheme;
config.DefaultSignInScheme = AzureADDefaults.AuthenticationScheme;
})
.AddAzureAD(options => Configuration.Bind("AzureAd", options))
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder(new[]
{
AzureADDefaults.AuthenticationScheme,
AzureADDefaults.JwtBearerAuthenticationScheme
})
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
已启用JWT的控制器均装饰有Authorize属性(不确定是否需要此属性,但似乎是这样)
[Authorize(AuthenticationSchemes = "AzureADJwtBearer")]
这使我知道两种方案都可以正常工作,但是在未通过身份验证时,没有重定向到Azure AD登录,这意味着...他们无法登录。 Location
标头已发送,但响应代码为401: Unauthorized
,因此浏览器将忽略它。