我非常沮丧的是,在Asp.Net Core中,身份验证方案似乎是强制性的。 我的目标是构建一个API,我不想知道客户端的任何信息。我已经建立了自定义身份验证和授权,工作正常。我没有使用身份或cookie。但是,如果没有有效的身份验证方案,我将无法返回403 Forbid结果,否则会出现以下异常...
System.InvalidOperationException:没有身份验证处理程序 配置为处理方案:自动
我的问题是,我是否可以将MVC配置为不使用身份验证方案或创建身份验证方案而不依赖于登录路径或任何路径?
答案 0 :(得分:2)
在仔细阅读Asp.net Core安全源代码后,我设法创建了一个自定义身份验证处理程序。为此,您需要实现3个类。
第一个类实现了一个抽象的AuthenticationOptions。
public class AwesomeAuthenticationOptions : AuthenticationOptions {
public AwesomeAuthenticationOptions() {
AuthenticationScheme = "AwesomeAuthentication";
AutomaticAuthenticate = false;
}
}
第二个类实现了一个抽象的AuthenticationHandler。
public class AwesomeAuthentication : AuthenticationHandler<AwesomeAuthenticationOptions>
{
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var prop = new AuthenticationProperties();
var ticket = new AuthenticationTicket(Context.User, prop, "AwesomeAuthentication");
//this is where you setup the ClaimsPrincipal
//if auth fails, return AuthenticateResult.Fail("reason for failure");
return await Task.Run(() => AuthenticateResult.Success(ticket));
}
}
第三个类实现了一个抽象的AuthenticationMiddleware。
public class AwesomeAuthenticationMiddleware : AuthenticationMiddleware<AwesomeAuthenticationOptions>
{
public AwesomeAuthenticationMiddleware(RequestDelegate next,
IOptions<AwesomeAuthenticationOptions> options,
ILoggerFactory loggerFactory,
UrlEncoder urlEncoder) : base(next, options, loggerFactory, urlEncoder) {
}
protected override AuthenticationHandler<AwesomeAuthenticationOptions> CreateHandler()
{
return new AwesomeAuthentication();
}
}
最后,在Startup.cs Configure方法中使用中间件组件。
app.UseMiddleware<AwesomeAuthenticationMiddleware>();
现在您可以构建自己的身份验证方案。