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很难分析,因为它们包含很多代码。
确保管道中有身份验证中间件,并将其放置在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)
您必须设置与身份验证方案绑定的默认授权策略:
services.AddAuthorization(options => {
options.DefaultPolicy = new AuthorizationPolicyBuilder()
.AddAuthenticationSchemes(Constants.NoOpSchema)
.RequireAuthenticatedUser()
.Build();
});
Run Code Online (Sandbox Code Playgroud)