【发布时间】:2018-04-19 08:25:35
【问题描述】:
我正在尝试在 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 => { });
如果特定控制器明确设置方案,一切正常:
[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 的处理程序很难分析,因为它们包含大量代码。
【问题讨论】:
-
您是否在中间件管道中添加了
app.UseAuthentication()? -
删除
AuthenticationSchemes时会出现什么错误? -
CustomAuthHandler 是做什么的?
-
我想你知道,但是你可以继承 authorize 属性来避免 AuthenticationSchemes= Constants.NoOpSchema
标签: c# authentication asp.net-core asp.net-core-mvc