我使用Cookie auth进行以下设置:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationScheme = CookieAuthenticationDefaults.AuthenticationScheme,
AutomaticAuthenticate = true,
AutomaticChallenge = false,
ExpireTimeSpan = new TimeSpan(2, 0, 0)
});
我假设在声明政策时使用[Authorize]
属性要求用户在评估自定义要求之前进行身份验证,但事实并非如此。
还尝试过此操作(请注意对RequireAuthenticatedUser()
的调用):
options.AddPolicy("MyPolicy",
policy =>
{
policy.RequireAuthenticatedUser();
policy.Requirements.Add(
new SomeRequirement(serviceProvider.GetService<IMyService>()));
});
然而,即便如此,在我的AuthorizationHandler
SomeRequirement
中,HandleRequirementAsync()
仍然会被执行。为什么呢?
我真的,真的,真的不想要这个:
if (!context.User.Identity.IsAuthenticated)
{
context.Fail();
return Task.FromResult(1);
}
坐在我所有的auth处理程序中。
答案 0 :(得分:2)
这是设计的。指定自定义授权策略时,替换默认授权策略。解决方法很简单:
[Authorize(Policy="foo")]
[Authorize]
这会合并您的政策和默认政策。
说明:这是政策合并的方式:AuthorizationPolicy。只有当policyProvider.GetDefaultPolicyAsync()
为空时(即,如果未指定自定义策略),您才会看到authorizeDatum.Policy
被调用。
仅供参考:默认政策只有一项要求:DenyAnonymousAuthorizationRequirement。 其重要部分是:
if (!userIsAnonymous)
{
context.Succeed(requirement);
}
return TaskCache.CompletedTask;
因此,它不会在匿名用户上失败,它会将控制流传递给下一个要求。需求链将持续到显式context.Fail()
调用或链结束。要在匿名用户上快速失败,请编写自定义要求并将其放在列表中:
if (userIsAnonymous) context.Fail()
答案 1 :(得分:2)
不想在自定义政策中处理未经身份验证的请求?执行blowdart在GitHub上的ASP.NET授权研讨会中列出的内容:authorize all endpoints with a default policy。
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
然后在需要时使用[AllowAnonymous]
。