Обход или выключение [Авторизовать (Роли = "")] во время разработки?

Построение приложения 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);
    }
}