我对ASP.NET Core 2中的身份验证有疑问,调用 app.UseAuthentication()到底是什么?
这是基本前提条件,以便我可以实现我的自定义身份验证逻辑吗?我已经看过UseAuthentication的实现以及实际的中间件AuthenticationMiddleware了,但是老实说,我不知道这实际上在做什么以及为什么有必要。
换句话说:
我是否需要致电 UseAuthentication()
还是很不错,我仍然可以进行自定义身份验证?
如果我不用调用 UseAuthentication()就可以了,那么我仍然会对AuthenticationMiddleware实际做什么感兴趣。因此,如果您知道我也将不胜感激,也将不胜感激。
最佳答案
如果您编写自定义中间件(如您在示例中所做的那样),则无需调用AddAuthentication
,因为身份验证中间件不会意识到您自己的中间件。
话虽这么说,您可能不想创建自己的中间件:您可能想要创建一个新的身份验证处理程序,该程序可以与ASP.NET身份验证框架很好地配合使用(以便在 Controller 上使用[Authorize]
属性)。
要创建自定义身份验证,必须创建一个从AuthenticationHandler
继承的专用处理程序,并实现相关方法。您可以看一下github上的基本身份验证示例:https://github.com/blowdart/idunno.Authentication,但这是一个快速示例,显示了自定义处理程序的要旨。
public class BasicAuthenticationOptions : AuthenticationSchemeOptions
{
public BasicAuthenticationOptions()
{
}
}
internal class BasicAuthenticationHandler : AuthenticationHandler<BasicAuthenticationOptions>
{
private const string _Scheme = "MyScheme";
public BasicAuthenticationHandler(
IOptionsMonitor<BasicAuthenticationOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock) : base(options, logger, encoder, clock)
{
}
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
string authorizationHeader = Request.Headers["Custom-Auth-Handler"];
// create a ClaimsPrincipal from your header
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, "My Name")
};
var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, Scheme.Name));
var ticket = new AuthenticationTicket(claimsPrincipal,
new AuthenticationProperties { IsPersistent = false },
Scheme.Name
);
return AuthenticateResult.Success(ticket);
}
}
然后,您可以在Startup.cs
中注册新方案:public void ConfigureServices(IServiceCollection services)
{
services
.AddAuthentication(BasicAuthenticationDefaults.AuthenticationScheme)
.AddScheme<BasicAuthenticationOptions, BasicAuthenticationHandler>("MyScheme", options => { /* configure options */ })
}