我的Asp.net核心网站默认需要身份验证
services.AddMvc(config =>
{
//only allow authenticated users
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
但是对于一个操作,我需要允许匿名访问(如果数据库中没有用户,则为/ Account / AddUser)。
我创建了这个自定义策略,用于检查用户是否经过身份验证,或者用户db是否为空。
[Authorize(Policy = "NoUsersInDatabaseOrUserAuthenticated")]
public IActionResult AddUser()
{
return View();
}
全球政策之间似乎存在一个AND,所以它不起作用。如果我添加[AllowAnonymous],则根本不评估该策略。
如何使用针对一个操作的自定义策略替换全局策略?
答案 0 :(得分:3)
你不能。政策是附加的。因此,全局将始终存在,然后评估任何额外的策略。此外,策略需要身份验证,您不能拥有允许未经身份验证的用户或其他内容的策略,必须始终对其进行身份验证,因为身份验证会对授权结果起作用。
答案 1 :(得分:2)
我最终离开了全局身份验证要求,并在操作上放置了AllowAnonymous。然后,我通过在检查用户经过身份验证或用户db为空的操作中添加代码来解决该要求。
答案 2 :(得分:0)
您可以删除全局授权策略,只需在控制器级别进行授权。如果您有一个标有[授权]的控制器和一个标记为[AllowAnnonymous](或您自己的自定义策略)的操作,那么特定于操作的标记就会先于。