开发期间绕过或关闭[授权(角色="")]?

Jam*_*e M 19 c# asp.net-mvc authorization authorize-attribute asp.net-mvc-3

构建MVC3应用程序,TPTB希望我们使用他们的自定义授权提供程序.但是,在开发过程中,这个身份验证提供程序很麻烦,因为它会在您关闭/重新启动浏览器时发出错误,或者需要您在每次编译时重新记录o.

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

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

编辑

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

我应该创建一个自动提供所有角色的小型自定义角色提供程序吗?

Dar*_*rov 32

您可以编写自定义授权过滤器,如果请求来自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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 怎么样比较检查Request.IsLocal?我认为它更"防弹". (3认同)
  • 您应该在返回的整个if块周围添加#if DEBUG-否则会在生产中带来潜在的数据丢失问题。如何阻止恶意管理员进入生产环境并输入http://127.0.0.1/refundCC?CC=1234689&amp;amount=infinity (2认同)

Anr*_*nri 16

您可以AuthorizeAttribute使用#if DEBUG指令继承和分离实现.

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

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


aba*_*hev 8

对于Web API:

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