【问题标题】:Bypass or turn off [Authorize(Roles="")] during development?在开发过程中绕过或关闭 [Authorize(Roles="")]?
【发布时间】:2012-11-25 21:26:36
【问题描述】:

构建一个 MVC3 应用程序,TPTB 希望我们使用他们的自定义授权提供程序。然而,在开发过程中,这个身份验证提供程序有点痛苦,因为它要么会在您关闭/重新启动浏览器之前给出错误,要么会要求您在每次编译时重新登录。

目前,我刚刚将 <authentication mode="None"/> 添加到 web.config,它工作正常,直到我遇到使用 [Authorize(Roles = "Admin")] 过滤器的操作或控制器(它可以是任何角色,而不仅仅是管理员)。当它点击其中一个时,它只会呈现一个空白页面。

有没有办法在全局范围内暂时关闭这些过滤器?或者只是在我进行开发时为用户提供所有角色?

编辑

让我澄清一下——我实际上是在将一个大型应用程序从 MVC2 移植到 MVC3。它有很多 [Authorize(Roles="Admin")][Authorize(Roles="Admin,Editor")] 贯穿其中。如果可能的话,我宁愿不改变所有这些。

我是否应该只创建一个小型自定义角色提供程序来自动提供所有角色?

【问题讨论】:

  • Anri 的回答更好,因为它不允许使用 http 代理漏洞来获取服务器上的管理员权限。

标签: c# asp.net-mvc asp.net-mvc-3 authorization authorize-attribute


【解决方案1】:

您可以编写一个自定义授权过滤器,如果请求来自localhost,它将不执行任何检查:

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext.Request.Url.IsLoopback)
        {
            // It was a local request => authorize the guy
            return true;
        }

        return base.AuthorizeCore(httpContext);
    }
}

【讨论】:

  • 谢谢,这就是我最终要做的。我很快意识到 Authorize 属性的搜索/替换比我考虑的其他任何事情都容易得多!
  • 不如检查 Request.IsLocal 怎么样?我认为它更“防弹”。
  • 您应该在 return 整个 if 块周围添加一个#if DEBUG - 否则您将在生产中打开潜在的数据丢失问题。什么可以阻止恶意管理员在生产环境中使用 IE 并输入 127.0.0.1/refundCC?CC=1234689&amount=infinity
  • 我经常喜欢if (Debugger.IsAttached) ..这样的情况
【解决方案2】:

您可以从AuthorizeAttribute 继承并使用#if DEBUG 指令分离实现。

public class MyAuthorizeAttribute: AuthorizeAttribute
{
#if DEBUG
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        return true;
    }
#endif
}

#define YOUR_OWN_FLAG 在任何构建、调试或发布中打开和关闭行为。

【讨论】:

  • 对不起,我是MVC新手,你把上面的代码放在哪里了?每个控制器?创业班?
  • 每个控制器,是的,虽然这不是 6 年前的答案,但我已经 4 年没有使用 .NET 并且不知道今天的正确方法是什么。
  • "虽然不是" = "虽然注意"
【解决方案3】:

对于 Web API:

public class MyAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        return actionContext.Request.RequestUri.IsLoopback || base.IsAuthorized(actionContext);
    }
}

【讨论】:

  • 环回测试太棒了哈哈为什么我没想到
  • 对于我们这些不经常编写自己的属性的人......上面的代码定义了一个自定义属性,您只需执行一次(如在您的基本控制器中)。要使用自定义授权属性,请将此代码放在您的控制器(或基本控制器)上:[MyAuthorize(Roles="Admin")]
【解决方案4】:

我也在寻找这个并最终像下面的代码一样解决。您可以在开发环境中添加 AllowAnonymousFilter,这将禁用开发环境中的授权。

if (env.IsDevelopment()) {
services.AddMvc(opts =>
{
   opts.Filters.Add(new AllowAnonymousFilter());
});
} else {
 services.AddMvc();
}

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2021-06-09
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多