gpt4 book ai didi

c# - ASP.Net 核心 2 : Default Authentication Scheme ignored

转载 作者:太空狗 更新时间:2023-10-29 20:02:26 25 4
gpt4 key购买 nike

我正在尝试在 ASP.Net Core 2 中构建自定义 AuthenticationHandler。跟进类似 ASP.NET Core 2.0 authentication middleware 的主题和 Why is Asp.Net Core Authentication Scheme mandatory ,我已经创建了特定的类。注册过程如下:

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 => { });

一切正常,如果特定的 Controller 明确地设置了方案:

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

但我不想设置架构,因为它应该动态添加。一旦我删除了 Scheme 属性,就像这样:

[Authorize]
[Route("api/[controller]")]
public class IndividualsController : Controller

它不再起作用了。

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

编辑:感谢您的提问,这对我帮助很大。当 CustomAuthHandler 不存在时,我只使用身份验证中间件映射 DefaultScheme。因此,我必须始终添加 AuthenticationMiddleware。

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

app.UseAuthentication();
app.UseMvc();

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

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)));
}

但即使我总是返回成功,我也会收到 401。我认为我必须更深入地挖掘并以某种方式设置一些声明,但不幸的是,Microsoft 的处理程序很难分析,因为它们包含很多代码。

最佳答案

ASP.NET Core 2 答案

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

services.AddAuthorization(options => {
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(Constants.NoOpSchema)
.RequireAuthenticatedUser()
.Build();
});

ASP.NET Core 3 答案

在 ASP.NET Core 3 中,事情显然发生了一些变化,因此您需要创建一个扩展方法来添加您的身份验证处理程序:

public static class NoOpAuthExtensions
{
public static AuthenticationBuilder AddNoOpAuth(this AuthenticationBuilder builder)
=> builder.AddNoOpAuth(NoOpAuthHandler.NoOpSchema, _ => { });
public static AuthenticationBuilder AddNoOpAuth(this AuthenticationBuilder builder, Action<NoOpAuthOptions> configureOptions)
=> builder.AddNoOpAuth(NoOpAuthHandler.NoOpSchema, configureOptions);
public static AuthenticationBuilder AddNoOpAuth(this AuthenticationBuilder builder, string authenticationScheme, Action<NoOpAuthOptions> configureOptions)
=> builder.AddNoOpAuth(authenticationScheme, null, configureOptions);
public static AuthenticationBuilder AddNoOpAuth(this AuthenticationBuilder builder, string authenticationScheme, string displayName, Action<NoOpAuthOptions> configureOptions)
{
return builder.AddScheme<NoOpAuthOptions, NoOpAuthHandler>(authenticationScheme, displayName, configureOptions);
}
}

并在您的 ConfigureServices 方法中使用它,如下所示:

services
.AddAuthentication(NoOpAuthHandler.NoOpSchema)
.AddNoOpAuth();

关于c# - ASP.Net 核心 2 : Default Authentication Scheme ignored,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49916216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com