21

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

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

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

编辑

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

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

4

4 回答 4

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);
    }
}
于 2012-12-07T16:59:45.913 回答
17

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

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

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

于 2012-12-07T17:01:08.773 回答
8

对于 Web API:

public class MyAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        return actionContext.Request.RequestUri.IsLoopback || base.IsAuthorized(actionContext);
    }
}
于 2015-01-06T06:49:49.467 回答
1

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

if (env.IsDevelopment()) {
services.AddMvc(opts =>
{
   opts.Filters.Add(new AllowAnonymousFilter());
});
} else {
 services.AddMvc();
}
于 2019-12-09T21:34:37.527 回答