为什么自定义策略中允许未经身份验证的请求?

时间:2017-05-25 19:01:04

标签: c# asp.net-core

我使用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处理程序中。

2 个答案:

答案 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]

相关问题