C# 在ASP.NET5中默认阻止匿名访问

C# 在ASP.NET5中默认阻止匿名访问,c#,asp.net-core,asp.net-core-mvc,C#,Asp.net Core,Asp.net Core Mvc,我和我的团队正在ASP.NET5中启动一个新的网站项目,我正在尝试建立我们的用户身份验证和授权策略的基础 到目前为止,我已经设法使用[Authorize]和[AllowAnonymous]属性有选择地定义授权策略控制器或操作。我仍在努力实现的一件事是定义默认授权策略 基本上,我希望每个控制器和操作在默认情况下都具有[Authorize]属性,这样匿名用户只能访问专门标记为[AllowAnonymous]的操作。否则,我们预计,在某个时候,有人会忘记向其控制器添加[Authorize]属性,并在w

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

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

基本上,我希望每个控制器和操作在默认情况下都具有[Authorize]属性,这样匿名用户只能访问专门标记为[AllowAnonymous]的操作。否则,我们预计,在某个时候,有人会忘记向其控制器添加[Authorize]属性,并在webapp中引入漏洞

我的理解是,通过在FilterConfig.cs中添加以下语句,可以在以前的ASP.NET版本中实现我的目标:

filters.Add(new AuthorizeAttribute());
。。。除了在MVC6中不再存在FilterConfig.cs之外。根据,我现在可以通过以下方式访问全局过滤器列表:

services.ConfigureMvc(options =>
{
   options.Filters.Add(new YouGlobalActionFilter());
}
。。。试过了,看起来不错,但现在我找不到属性过滤器了

出于实验目的,我尝试手工制作一个与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 thingy丑陋且具有误导性:它没有任何用途,在整个处理过程中显然被忽略。我添加它的唯一原因是AuthorizationFilter在其构造函数中需要AuthorizationPolicy。我猜,但还没有尝试,直接实现IAsyncAuthorizationFilter可以解决这个特殊问题

  • 这段代码中没有任何内容是针对我的webapp的,而且该功能显然是在以前版本的框架中提供的,因此我愿意打赌,已经有(或很快就会有)一个组件在做完全相同的事情,我宁愿使用框架中的标准组件,也不愿手工制作自己的组件

那么,长话短说,属性过滤器到哪里去了?或者,我可以使用任何功能等价物将拒绝匿名用户作为默认行为吗?

您可以使用


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

试试猜什么。。。它可以工作-u-v我想当我第一次尝试它时,我被构造函数中的授权策略弄糊涂了,所以我最终选择了“继承和实验”路线。谢谢。。。请写下你的评论作为回答,这样我才能接受。实际上,没有AuthorizationPolicy参数,你不能实例化AuthorizationFilter。。。我通过传递“new AuthorizationPolicyBuilder().RequireAuthenticationDuser().Build()”使其正常工作,感谢您的回答。立即在Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter下找到AuthorizeFilter,而不是在Mvc下直接找到。
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Authorization;

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