Обход или выключение [Авторизовать (Роли = "")] во время разработки?
Построение приложения MVC3, и TPTB хотят, чтобы мы использовали свой собственный поставщик авторизации. Тем не менее, во время разработки этот провайдер auth представляет собой боль, поскольку он либо выдаст ошибку, либо выключит/перезапустит браузер, либо потребует повторной регистрации o на каждом компиляторе.
В настоящее время я просто добавил <authentication mode="None"/>
в web.config, который отлично работает, пока не встретит действие или контроллер, который использует фильтр [Authorize(Roles = "Admin")]
(это может быть любая роль, а не только Admin). Когда он попадает на один из них, он просто отображает пустую страницу.
Есть ли способ глобально и временно отключить эти фильтры? Или просто укажите пользователю все роли, пока я нахожусь в разработке?
EDIT
Позвольте мне пояснить - я фактически переношу большое приложение из MVC2 в MVC3. В нем есть много [Authorize(Roles="Admin")]
и [Authorize(Roles="Admin,Editor")]
. Я бы предпочел не менять всех, если это возможно.
Должен ли я просто создать небольшой поставщик роли, который автоматически предоставляет все роли?
Ответы
Ответ 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);
}
}
Ответ 2
Вы можете наследовать от AuthorizeAttribute
и отдельные реализации с директивой #if DEBUG
.
public class MyAuthorizeAttribute: AuthorizeAttribute
{
#if DEBUG
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return true;
}
#endif
}
Или #define YOUR_OWN_FLAG
, чтобы включить или отключить поведение в любой сборке, отладке или выпуске.
Ответ 3
Для веб-API:
public class MyAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
return actionContext.Request.RequestUri.IsLoopback || base.IsAuthorized(actionContext);
}
}