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

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

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

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

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

据我了解,通过在 FilterConfig.cs 中添加以下语句,可以在以前版本的 ASP .NET 中实现我正在尝试做的事情:

filters.Add(new AuthorizeAttribute());

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

这有点管用...我可以将它添加到全局过滤器列表中,并且它会拒绝来自未经身份验证的用户的查询,除非该查询被解析为标记为 [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()));
});

如果您需要自定义授权要求,请参阅 this answer获取更多信息。

关于c# - 在 ASP .NET 5 中默认阻止匿名访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31983188/

相关文章:

c# - 在 Asp.net core 中间件中访问 ModelState

c# - ASP.NET Core MVC 异步加载 session

asp.net-core - .NET Core 运行时无需安装

c# - Asp.net 核心 session 单元测试

c# - 在 C# 属性类的构造函数中,如何判断正在处理的属性目标?

c# - 如何在 Neo4j 中聚合关系计数

c# - 调用 NUnit 断言方法时访问自定义异常代码

c# - ASP.NET 核心 : Session Id Always Changes

C# 使用 XmlText 序列化 XmlElement

asp.net - 尝试访问 Azure Web 应用程序中的特定页面时发生错误