【问题标题】:Require authenticated user in asp.net core but require custom policy in some actions require custom policy在 asp.net 核心中需要经过身份验证的用户,但在某些操作中需要自定义策略需要自定义策略
【发布时间】:2016-07-25 17:55:42
【问题描述】:

我的 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();
}

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

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

【问题讨论】:

    标签: c# asp.net-core authorization


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您能否在控制器上设置一个策略,然后在路由上设置一个不同的策略,从而“覆盖”控制器策略?
    • @blowdart 您说“......策略需要身份验证......它们必须始终进行身份验证,因为身份验证会根据授权结果起作用”。我很好奇,如果Authorize(Policy="SomePolicy") 总是产生经过身份验证的用户,policy.RequireAuthenticatedUser() 的目的是什么?
    【解决方案3】:

    您可以删除全局授权策略,并在控制器级别进行授权。如果您有一个标有 [Authorize] 的控制器和一个标有 [AllowAnnonymous] 的操作(或您自己的自定义策略),那么特定于操作的标记优先。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2011-09-18
      • 2011-05-12
      • 2011-12-01
      • 2016-05-19
      • 2021-03-23
      相关资源
      最近更新 更多