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

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

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

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

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

filters.Add(new AuthorizeAttribute()); 

…除了在MVC 6中不再存在FilterConfig.cs。根据如何使用mvc 6注册全局filter,asp.net 5我现在可以使用以下命令访问全局filter列表:

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

…尝试过,看起来很好,但现在它是我无法找到的AuthorizeAttributefilter。

出于实验目的,我试图手工创建一个与AuthorizeAttributefilter等效的filter,并提出以下建议:

 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); } } 

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

然而…

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

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

那么,长话短说, AuthorizeAttributefilter去了哪里 ? 或者是否有任何function等价物可以用来拒绝匿名用户的默认行为?

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

 using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Authorization; services.ConfigureMvc(options => { options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build())); }); 

如果您需要自定义授权要求,请参阅此答案以获取更多信息