网站默认只允许匿名访问。
管理员有一个按钮可以将网站切换到维护模式,这应该启用使用内置 CookieAuthentication 的授权(在数据库中翻转一个位,与本帖子无关)。
为了使其正常工作,我首先配置了 cookie 身份验证(在 startup.cs 中):
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
options =>
{
options.LoginPath = new PathString("/auth/login");
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseAuthentication();
}
然后在相关的控制器上,我加上了[Authorize]
属性。
[Authorize]
public class HomeController : Controller
{
//removed
}
这很完美 - 当authorize属性存在时,cookie认证会生效。目前为止一切顺利。
现在我想在运行时禁用授权,当维护模式关闭时。
尝试的解决方案
在经过大量试错和研究后,这就是我最终得出的结果。
public void OnAuthorization(AuthorizationFilterContext context)
{
IMaintenanceModeDataService ds = context.HttpContext.RequestServices.GetService<IMaintenanceModeDataService>();
if (!ds.IsMaintenanceModeEnabled)
{
//Maintenance mode is off, no need for authorization
return;
}
else
{
ClaimsPrincipal user = context.HttpContext.User;
if (user.Identity.IsAuthenticated)
{
//when the user is authenticated, we don't need to do anything else.
return;
}
else
{
//we're in maintenance mode AND the user is not
//It is outside the scope of this to redirect to a login
//We just want to display maintenancemode.html
context.Result = new RedirectResult("/maintenancemode.html");
return;
}
}
}
[MaintenanceModeAwareAuthorize]
public class HomeController : Controller
{
//removed
}
当网站处于维护模式时,这很有效。
当网站未处于维护模式时,cookie身份验证仍然会启动并需要身份验证。我可以删除它并尝试实现自己的身份验证,但这是愚蠢的,因为我们已经内置了完美精良的解决方案。
如何在网站未处于维护模式(运行时)禁用授权?
备注:
问:为什么不通过执行x(需要访问配置、环境变量、服务器或类似内容)来处理此问题?
答:因为非技术管理员用户需要通过后端中的按钮立即访问此功能。
context.Succeed(requirement); return Task.CompletedTask;
- Adrian Hristov