我的团队和我正在ASP .NET 5中启动一个新的网站项目,我正在尝试建立我们的用户身份验证和授权策略的基础.
到目前为止,我已经设法使用[Authorize]和[AllowAnonymous]属性来有选择地定义授权策略控制器或操作.我仍在努力实现的一件事是定义默认授权策略.
基本上,我希望每个控制器和操作的行为都像默认情况下具有[Authorize]属性一样,这样只有匿名用户才能访问专门标记为[AllowAnonymous]的操作.否则,我们预计,在某些时候,有人会忘记向其控制器添加[Authorize]属性并将漏洞引入webapp.
我的理解是,通过在FilterConfig.cs中添加以下语句,可以在以前版本的ASP .NET中实现我想要做的事情:
filters.Add(new AuthorizeAttribute());
Run Code Online (Sandbox Code Playgroud)
...除了在MVC 6中不再存在FilterConfig.cs.根据如何使用mvc 6注册全局过滤器,asp.net 5我现在可以使用以下命令访问全局过滤器列表:
services.ConfigureMvc(options =>
{
options.Filters.Add(new YouGlobalActionFilter());
}
Run Code Online (Sandbox Code Playgroud)
...尝试过,看起来不错,但现在它是我无法找到的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);
}
}
Run Code Online (Sandbox Code Playgroud)
这种方式有用...我可以将它添加到全局筛选器列表中,它会拒绝来自未经身份验证的用户的查询,除非查询被解析为标记为[AllowAnonymous]的操作.
然而...
AuthorizationPolicyBuilder的东西是丑陋和误导性的:它没有任何用途,在整个处理过程中显然被忽略了.我添加它的唯一原因是AuthorizeFilter在其构造函数中需要AuthorizationPolicy.我想,但还没有尝试过,直接实现IAsyncAuthorizationFilter可以解决这个特殊问题 …