ASP.Net核心2:默认身份验证方案被忽略

Mat*_*ler 9 c# authentication asp.net-core-mvc asp.net-core

我正在尝试在ASP.Net Core 2中构建自定义AuthenticationHandler。在跟进ASP.NET Core 2.0身份验证中间件以及为什么Asp.Net Core Authentication Scheme是强制性主题之后,我创建了特定的类。注册发生如下:

services.AddAuthentication(
    options =>
    {
        options.DefaultScheme = Constants.NoOpSchema;
        options.DefaultAuthenticateScheme = Constants.NoOpSchema;
        options.DefaultChallengeScheme = Constants.NoOpSchema;
        options.DefaultSignInScheme = Constants.NoOpSchema;
        options.DefaultSignOutScheme = Constants.NoOpSchema; 
        options.DefaultForbidScheme = Constants.NoOpSchema;
    }
).AddScheme<CustomAuthOptions, CustomAuthHandler>(Constants.NoOpSchema, "Custom Auth", o => { });
Run Code Online (Sandbox Code Playgroud)

如果特定的控制器明确设置了Scheme,则一切正常。

[Authorize(AuthenticationSchemes= Constants.NoOpSchema)]
[Route("api/[controller]")]
public class IndividualsController : Controller
Run Code Online (Sandbox Code Playgroud)

但是我不想设置模式,因为它应该动态添加。删除计划属性后,如下所示:

[Authorize]
[Route("api/[controller]")]
public class IndividualsController : Controller
Run Code Online (Sandbox Code Playgroud)

它不再起作用了。

我本来希望,设置DefaultScheme属性可以完成这项工作。有趣的是,我没有找到关于此主题的任何具体讨论。我在这里做错什么了吗?还是我的预期结果不对?

编辑:感谢您的问题,它对我有很大帮助。好像在没有CustomAuthHandler时,我仅使用的身份验证中间件正在映射DefaultScheme。因此,我必须始终添加AuthenticationMiddleware。

Edit2:不幸的是,它仍然不起作用。为了进一步说明我的问题:我将像往常一样添加中间件:

app.UseAuthentication();
app.UseMvc();
Run Code Online (Sandbox Code Playgroud)

现在,进入我的处理程序,它看起来像这样:

public class NoOpAuthHandler : AuthenticationHandler<NoOpAuthOptions>
{
    public const string NoOpSchema = "NoOp";

    public NoOpAuthHandler(IOptionsMonitor<NoOpAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync() => Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(Context.User, NoOpSchema)));
}
Run Code Online (Sandbox Code Playgroud)

但是,即使我总是返回成功,我也会得到401。我认为我必须更深入地研究并提出一些声明,但是不幸的是,Microsoft的Handler很难分析,因为它们包含很多代码。

Kah*_*azi 9

确保管道中有身份验证中间件,并将其放置在MVC之前。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ///

    app.UseAuthentication();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action=Index}/{id?}");
    });
    ///
}
Run Code Online (Sandbox Code Playgroud)

更新

尝试在HandleAuthenticateAsync方法中使用此代码。

protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
    List<Claim> claims = new List<Claim>();
    ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims, Scheme.Name);
    ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
    AuthenticationTicket authenticationTicket = new AuthenticationTicket(claimsPrincipal, Scheme.Name);
    return AuthenticateResult.Success(authenticationTicket);
}
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,在 .NET Core 3/5 中,请确保在“app.UseAuthorization()”之前具有“app.UseAuthentication”。我一天的时间就这样过去了 2 个小时:) (2认同)

Rap*_*elH 5

您必须设置与身份验证方案绑定的默认授权策略:

services.AddAuthorization(options => {
  options.DefaultPolicy = new AuthorizationPolicyBuilder()
    .AddAuthenticationSchemes(Constants.NoOpSchema)
    .RequireAuthenticatedUser()
    .Build();
});
Run Code Online (Sandbox Code Playgroud)