在 ASP .NET 5 中默认阻止匿名访问
Blocking anonymous access by default in ASP .NET 5
我和我的团队正在 ASP .NET 5 中启动一个新网站项目,我正在尝试建立我们的用户身份验证和授权策略的基础。
到目前为止,我已经设法使用 [Authorize] 和 [AllowAnonymous] 属性来有选择地定义授权策略控制器或操作。我仍在努力实现的一件事是定义 default 授权策略。
基本上,我希望每个控制器和动作的行为都好像它们默认具有 [Authorize] 属性一样,这样匿名用户只能访问明确标记为 [AllowAnonymous] 的动作。否则,我们预计,在某些时候,有人会忘记向其控制器添加 [Authorize] 属性并将漏洞引入 webapp。
据我了解,通过在 FilterConfig.cs:
中添加以下语句,可以在 ASP .NET 的早期版本中实现我正在尝试做的事情
filters.Add(new AuthorizeAttribute());
... 除了 MVC 6 中不再存在 FilterConfig.cs。根据 ,我现在可以使用以下方式访问全局过滤器列表:
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 可以解决这个特定问题
此代码中没有任何内容是我的 webapp 特有的,并且该功能显然是在以前版本的框架中提供的,所以我敢打赌已经有(或很快会有)一个组件做完全相同的事情,我宁愿使用框架中的标准组件也不愿自己手工制作。
那么,长话短说,AuthorizeAttribute 过滤器去哪儿了?或者是否有任何功能等价物可以用来使拒绝匿名用户成为默认行为?
您可以使用 Microsoft.AspNet.Mvc.AuthorizeFilter.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Authorization;
services.ConfigureMvc(options =>
{
options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
});
如果您需要自定义授权要求,请参阅 了解更多信息。
我和我的团队正在 ASP .NET 5 中启动一个新网站项目,我正在尝试建立我们的用户身份验证和授权策略的基础。
到目前为止,我已经设法使用 [Authorize] 和 [AllowAnonymous] 属性来有选择地定义授权策略控制器或操作。我仍在努力实现的一件事是定义 default 授权策略。
基本上,我希望每个控制器和动作的行为都好像它们默认具有 [Authorize] 属性一样,这样匿名用户只能访问明确标记为 [AllowAnonymous] 的动作。否则,我们预计,在某些时候,有人会忘记向其控制器添加 [Authorize] 属性并将漏洞引入 webapp。
据我了解,通过在 FilterConfig.cs:
中添加以下语句,可以在 ASP .NET 的早期版本中实现我正在尝试做的事情filters.Add(new AuthorizeAttribute());
... 除了 MVC 6 中不再存在 FilterConfig.cs。根据
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 可以解决这个特定问题
此代码中没有任何内容是我的 webapp 特有的,并且该功能显然是在以前版本的框架中提供的,所以我敢打赌已经有(或很快会有)一个组件做完全相同的事情,我宁愿使用框架中的标准组件也不愿自己手工制作。
那么,长话短说,AuthorizeAttribute 过滤器去哪儿了?或者是否有任何功能等价物可以用来使拒绝匿名用户成为默认行为?
您可以使用 Microsoft.AspNet.Mvc.AuthorizeFilter.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Authorization;
services.ConfigureMvc(options =>
{
options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));
});
如果您需要自定义授权要求,请参阅