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

Require authenticated user in asp.net core but require custom policy in some actions require custom policy

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

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

    config.Filters.Add(new AuthorizeFilter(policy));
});

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

我创建了这个自定义策略来检查用户是否已通过身份验证或用户数据库是否为空。

[Authorize(Policy = "NoUsersInDatabaseOrUserAuthenticated")]
public IActionResult AddUser()
{
    return View();
}

全局策略和这个之间似乎有一个 AND,所以它不起作用。如果我添加 [AllowAnonymous],则根本不会评估该策略。

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

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

你可以去掉全局授权策略,只在controller级别授权。如果您有一个标有 [Authorize] 的控制器和一个标有 [AllowAnnonymous] 的操作(或您自己的自定义策略),则特定于操作的标签会优先。

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