默认情况下在ASP .NET 5

时间:2015-08-13 08:30:58

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

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

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

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

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

filters.Add(new AuthorizeAttribute());

...除了在MVC 6中不再存在FilterConfig.cs。根据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);
    }
}

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

...然而

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

  • 此代码中没有任何内容特定于我的webapp,并且该功能显然是在以前版本的框架中提供的,所以我愿意打赌已经(或者很快就会有)组件做同样的事情,我宁愿使用框架中的标准组件而不是手工制作。

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

1 个答案:

答案 0 :(得分:8)

您可以使用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以获取更多信息。