如何创建一个在 .Net Core 中什么都不做的身份验证方案?
How do you create an Authentication scheme that does nothing in .Net Core?
在开发、暂存和生产中,我的控制器使用 [Authorize] 属性来确保只有授权用户才能访问这些方法。这显然需要连接到身份验证服务。
但是,我和我的团队经常乘坐火车和飞机,那里的 WIFI 服务不可靠。在飞机旅行中删除这些属性以进行开发,然后将它们放回生产中并不是一个可行的解决方案。我希望有一个选项来配置 Web 服务,以便它在尝试进行身份验证时不执行任何操作,这样我们仍然可以在长途旅行中进行开发。我见过一些自定义身份验证方案,但是否有简单的方法 'do nothing' 或什么都不做的简单自定义身份验证方案的快速示例?
好的,通过一些更复杂的例子来解决这个问题:
public class LocalAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public LocalAuthenticationHandler(
IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock)
: base(options, logger, encoder, clock)
{
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
// Create an empty claims identity and pass it off as a valid user. This is only valid in a local build environment to bypass the
// web-based authentication service.
var principal = new ClaimsPrincipal(new ClaimsIdentity(Array.Empty<Claim>(), this.Scheme.Name));
return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(principal, this.Scheme.Name)));
}
}
并且在 startup.cs
serviceCollection.AddAuthentication(options => options.DefaultAuthenticateScheme = "Local")
.AddScheme<AuthenticationSchemeOptions, LocalAuthenticationHandler>("Local", null);
在开发、暂存和生产中,我的控制器使用 [Authorize] 属性来确保只有授权用户才能访问这些方法。这显然需要连接到身份验证服务。
但是,我和我的团队经常乘坐火车和飞机,那里的 WIFI 服务不可靠。在飞机旅行中删除这些属性以进行开发,然后将它们放回生产中并不是一个可行的解决方案。我希望有一个选项来配置 Web 服务,以便它在尝试进行身份验证时不执行任何操作,这样我们仍然可以在长途旅行中进行开发。我见过一些自定义身份验证方案,但是否有简单的方法 'do nothing' 或什么都不做的简单自定义身份验证方案的快速示例?
好的,通过一些更复杂的例子来解决这个问题:
public class LocalAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public LocalAuthenticationHandler(
IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock)
: base(options, logger, encoder, clock)
{
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
// Create an empty claims identity and pass it off as a valid user. This is only valid in a local build environment to bypass the
// web-based authentication service.
var principal = new ClaimsPrincipal(new ClaimsIdentity(Array.Empty<Claim>(), this.Scheme.Name));
return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(principal, this.Scheme.Name)));
}
}
并且在 startup.cs
serviceCollection.AddAuthentication(options => options.DefaultAuthenticateScheme = "Local")
.AddScheme<AuthenticationSchemeOptions, LocalAuthenticationHandler>("Local", null);