在 ASP .NET 5 中默认阻止匿名访问

Blocking anonymous access by default in ASP .NET 5

我和我的团队正在 ASP .NET 5 中启动一个新网站项目,我正在尝试建立我们的用户身份验证和授权策略的基础。

到目前为止,我已经设法使用 [Authorize] 和 [AllowAnonymous] 属性来有选择地定义授权策略控制器或操作。我仍在努力实现的一件事是定义 default 授权策略。

基本上,我希望每个控制器和动作的行为都好像它们默认具有 [Authorize] 属性一样,这样匿名用户只能访问明确标记为 [AllowAnonymous] 的动作。否则,我们预计,在某些时候,有人会忘记向其控制器添加 [Authorize] 属性并将漏洞引入 webapp。

据我了解,通过在 FilterConfig.cs:

中添加以下语句,可以在 ASP .NET 的早期版本中实现我正在尝试做的事情
filters.Add(new AuthorizeAttribute());

... 除了 MVC 6 中不再存在 FilterConfig.cs。根据 ,我现在可以使用以下方式访问全局过滤器列表:

services.ConfigureMvc(options =>
{
   options.Filters.Add(new YouGlobalActionFilter());
}

...试了一下,看起来不错,但是现在好像找不到AuthorizeAttribute过滤器了。

出于实验目的,我尝试手工制作一个与 AuthorizeAttribute 过滤器等效的过滤器,并得出以下结果:

public class LoginFilter: AuthorizeFilter
{
    public LoginFilter(): base(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build())
    {

    }

    public override Task OnAuthorizationAsync(Microsoft.AspNet.Mvc.AuthorizationContext context)
    {
        if(!context.HttpContext.User.Identity.IsAuthenticated && context.ActionDescriptor is ControllerActionDescriptor)
        {
            var action = context.ActionDescriptor as ControllerActionDescriptor;
            if(!AcceptAnonymous(action.ControllerTypeInfo) && !AcceptAnonymous(action.MethodInfo))
            {
                context.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
            }
        }
        return base.OnAuthorizationAsync(context);
    }

    private static bool AcceptAnonymous(ICustomAttributeProvider o)
    {
        return o.IsDefined(typeof(AllowAnonymousAttribute), true);
    }
}

这有点管用...我可以将它添加到全局过滤器列表中,它会拒绝来自未经身份验证的用户的查询,除非查询被解析为标记为 [AllowsAnonymous] 的操作。

然而...

那么,长话短说,AuthorizeAttribute 过滤器去哪儿了?或者是否有任何功能等价物可以用来使拒绝匿名用户成为默认行为?

您可以使用 Microsoft.AspNet.Mvc.AuthorizeFilter.

using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Authorization;

services.ConfigureMvc(options =>
{
   options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
});

如果您需要自定义授权要求,请参阅 了解更多信息。