我正在尝试将ASP.NET Core 1.1应用程序升级到2.0。该应用程序需要两个基本身份验证和JWT一个。我有代码看起来像这样:
services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddBasic(BasicScheme, _ => { })
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{...}
我的问题是,我似乎无法让他们两个同时工作!我设置为DefaultScheme的唯一一个是有效的,另一个是中断并返回HTTP 401。
任何想法我怎样才能使它们都起作用?
答案 0 :(得分:2)
只是设法让这个工作......这个链接帮助:https://wildermuth.com/2017/08/19/Two-AuthorizationSchemes-in-ASP-NET-Core-2
重要的一点是:When we use the Authorize attribute, it actually binds to the first authentication system by default. The trick is to change the attribute to specify which auth to use:
答案 1 :(得分:0)
您必须从AddAuthotization方法中删除选项:
services.AddAuthentication()
.AddBasic(BasicScheme, _ => { })
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{...}
然后修改您的Configure()方法Startup.cs,添加以下使用说明:
app.Use(async (context, next) =>
{
// Write some code that determines the scheme based on the incoming request
string scheme = GetSchemeForRequest(context);
var result = await context.AuthenticateAsync(scheme);
if (result.Succeeded)
{
context.User = result.Principal;
}
await next();
});
现在,在GetSchemeForRequest方法中,您可以确定应使用哪种方案。 我找到了答案here并应用于我的代码。可行!