首页 > 解决方案 > [Authorize(Policy = "PolicyName")] 如何在 asp.net 核心中工作?

问题描述

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

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

为什么 [Authorize] 属性在这里是必需的?如果 [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() 操作。这是怎么回事?对不起,我的英语不好。谢谢你。

标签: asp.net

解决方案


试试下面的代码

 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


推荐阅读