有人可以告诉我[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()操作。这是怎么回事?对不起,我的英语不好。谢谢。
答案 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;
}