【问题标题】:Blocking anonymous access by default in ASP .NET 5在 ASP .NET 5 中默认阻止匿名访问
【发布时间】:2015-08-13 08:30:57
【问题描述】:

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

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

基本上,我希望每个控制器和动作默认都具有 [Authorize] 属性,以便匿名用户只能访问专门标记为 [AllowAnonymous] 的动作。否则,我们预计,在某些时候,有人会忘记将 [Authorize] 属性添加到他们的控制器并在 web 应用程序中引入漏洞。

据我了解,通过在 FilterConfig.cs 中添加以下语句,可以在以前版本的 ASP .NET 中实现我想要做的事情:

filters.Add(new AuthorizeAttribute());

... 除了 FilterConfig.cs 在 MVC 6 中不再存在。根据How to register a global filter with mvc 6, asp.net 5,我现在可以使用以下方法访问全局过滤器列表:

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] 的操作。

不过……

  • AuthorizationPolicyBuilder 丑陋且具有误导性:它没有任何用途,并且在整个处理过程中显然被忽略了。我添加它的唯一原因是 AuthorizeFilter 在其构造函数中需要 AuthorizationPolicy。我想,但还没有尝试过,直接实现 IAsyncAuthorizationFilter 可以解决这个特定问题

  • 1234563同样的事情,我宁愿使用框架中的标准组件而不是自己手工制作。

长话短说,AuthorizeAttribute 过滤器去了哪里?或者是否有任何等效的功能可以让拒绝匿名用户成为默认行为?

【问题讨论】:

  • 猜猜是什么...它有效-_-v 我想当我第一次尝试它时,我被构造函数中的 AuthorizePolicy 弄糊涂了,所以我最终选择了“继承和实验”路线。非常感谢...请写下您的评论作为答案,以便我接受。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

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

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

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

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

【讨论】:

  • 实际上,你不能在没有 AuthorizationPolicy 参数的情况下实例化 AuthorizeFilter...我通过传递“new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()”来让它工作
  • 感谢您的回答。现在在 Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter 下找到了 AuthorizeFilter 而不是直接在 Mvc 下。
猜你喜欢
  • 2015-08-30
  • 1970-01-01
  • 2019-04-24
  • 2012-11-20
  • 1970-01-01
  • 2019-11-15
  • 2016-04-25
  • 1970-01-01
  • 2014-03-28
相关资源
最近更新 更多