在ASP.NET Core中[Authorize(Policy =“ PolicyName”)]如何工作?

时间:2019-09-21 12:45:38

标签: asp.net

有人可以告诉我[Authorize(Policy =“ PolicyName”)]的工作原理,当用户未登录时为什么运行策略?例如,如果我从.RequireAssertion方法的委托返回“ true”,则即使用户是匿名用户也可以访问操作或控制器?

[Authorize]
[Authorize(Policy = "TestAccess")]
public async Task<IActionResult> Test()
{
   return Json("Test Actioned Reached");
}

为什么这里需要[授权]属性?如果[Authorize(Policy =“ TestAccess”)]表示-当用户不是匿名用户并且通过了此策略时,将到达操作/控制器?

如果我写:

[Authorize(Policy = "TestAccess")]
public async Task<IActionResult> Test()
{
    return Json("Test Actioned Reached");
}

和政策如下:

services.AddAuthorization(options => {
options.AddPolicy("TestAccess", policy => policy.RequireAssertion(context =>
   {
       return true;  // For Testing only

   }));
});
即使用户是匿名用户,也会执行

Test()操作。这是怎么回事?对不起,我的英语不好。谢谢。

1 个答案:

答案 0 :(得分:0)

尝试以下代码

 services.AddAuthorization(options => {
                    options.AddPolicy("TestAccess", policy => policy.RequireAssertion(context => context.User.HasClaim("your claim type ","your claim value")));
                });

您的代码只是在“需求管道”中添加了“ true”

services.AddAuthorization(options => {
options.AddPolicy("TestAccess", policy => policy.RequireAssertion(context =>
   {
       return true;  // For Testing only

   }));
});

以上代码在处理程序的管道中添加true,并且true还满足包括匿名用户在内的所有条件。

有关详细信息,请查看src代码方法

public AuthorizationPolicyBuilder RequireAssertion(Func<AuthorizationHandlerContext, bool> handler)
        {
            if (handler == null)
            {
                throw new ArgumentNullException(nameof(handler));
            }

            Requirements.Add(new AssertionRequirement(handler));
            return this;
        }

AuthorizationPolicyBuilder.cs