在 asp.net core 中需要经过身份验证的用户,但在某些操作中需要自定义策略需要自定义策略

Mat*_*und 5 c# authorization asp.net-core

默认情况下,我的 Asp.net 核心站点需要身份验证

services.AddMvc(config =>
{
    //only allow authenticated users
    var policy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .Build();

    config.Filters.Add(new AuthorizeFilter(policy));
});
Run Code Online (Sandbox Code Playgroud)

但是对于一项操作,我需要允许匿名访问(如果数据库中没有用户,则为 /Account/AddUser)。

我创建了此自定义策略,用于检查用户是否已通过身份验证或用户 db 是否为空。

[Authorize(Policy = "NoUsersInDatabaseOrUserAuthenticated")]
public IActionResult AddUser()
{
    return View();
}
Run Code Online (Sandbox Code Playgroud)

全球政策与此之间似乎存在 AND,因此它不起作用。如果我添加 [AllowAnonymous],则根本不会评估该政策。

如何将全局策略替换为一项操作的自定义策略?

blo*_*art 5

你不能。政策是累加性的。因此,全局将始终存在,然后再评估任何额外的策略。此外,策略需要身份验证,您不能有允许未经身份验证的用户或其他内容的策略,它们必须始终经过身份验证,因为身份验证会根据授权结果进行操作。

  • @blowdart您表示“......策略需要身份验证......它们必须始终经过身份验证,因为身份验证根据授权结果起作用”。我很好奇,如果 `Authorize(Policy="SomePolicy")` 总是导致经过身份验证的用户,那么 `policy.RequireAuthenticatedUser()` 的目的是什么? (4认同)

Mat*_*und 5

我最终离开了全局身份验证要求并将 AllowAnonymous 放在操作上。然后,我通过在检查用户是否已通过身份验证或用户 db 为空的操作中添加代码来解决该要求。