构建MVC3应用程序,TPTB希望我们使用他们的自定义授权提供程序。但是,在开发过程中,这个auth提供程序很麻烦,因为它会在关闭/重新启动浏览器时发出错误,或者需要您在每次编译时重新记录o。
现在,我刚刚将<authentication mode="None"/>
添加到了web.config中,这可以正常工作,直到遇到使用[Authorize(Roles = "Admin")]
过滤器的操作或控制器(它可以是任何角色,而不仅仅是Admin) 。当它击中其中一个时,它只会呈现一个空白页面。
全球是否有办法暂时关闭这些过滤器?或者只是在我开发过程中为用户提供所有角色?
编辑
让我澄清一下 - 我实际上正在将一个大型应用程序从MVC2移植到MVC3。它中有很多[Authorize(Roles="Admin")]
和[Authorize(Roles="Admin,Editor")]
。如果可能的话,我宁愿不改变所有这些。
我是否应该创建一个自动提供所有角色的小型自定义角色提供程序?
答案 0 :(得分:31)
您可以编写自定义授权过滤器,如果请求来自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);
}
}
答案 1 :(得分:15)
您可以继承AuthorizeAttribute
并使用#if DEBUG
指令单独实现。
public class MyAuthorizeAttribute: AuthorizeAttribute
{
#if DEBUG
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return true;
}
#endif
}
或#define YOUR_OWN_FLAG
在任何构建,调试或发布中打开和关闭行为。
答案 2 :(得分:7)
对于Web API:
public class MyAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
return actionContext.Request.RequestUri.IsLoopback || base.IsAuthorized(actionContext);
}
}
答案 3 :(得分:0)
我也一直在寻找并最终解决如下代码。您可以只在开发环境中添加AllowAnonymousFilter,这将在开发环境中禁用授权。
if (env.IsDevelopment()) {
services.AddMvc(opts =>
{
opts.Filters.Add(new AllowAnonymousFilter());
});
} else {
services.AddMvc();
}