2013-08-30 3 views
4

Использование приложения MVC4, использующего .NET 4.5 и IIS 8. Есть ли способ вернуть пользовательскую неавторизованную страницу и результат 401, когда проверка разрешения не удалась?Как вернуть ответ 401 и пользовательскую страницу?

Я также использую проверку подлинности с помощью форм и хочу перенаправить на страницу входа в систему, когда пользователь не вошел в систему, но перенаправляет на неавторизованную страницу, если у пользователя нет действительного разрешения (т. Е. Администратор).

Я также должен быть осторожным в перенаправлении, а затем достижении результата 200/301 при успешной перенаправлении.

Мне нужно вернуть код состояния 401 и остаться на текущей странице, а также вернуть пользовательскую несанкционированную страницу.

У меня есть контроллер ошибок, возвращающие несанкционированный вид:

[ActionName("unauthorised")] 
    public ActionResult Http401() { 
     Response.StatusCode = 401; 
     Response.StatusDescription = "Unauthorised"; 
     Response.SuppressFormsAuthenticationRedirect = true; 
     return View("unauthorised"); 
    } 

И у меня есть некоторые методы, которые я использую, чтобы попытаться вызвать 401, если проверку разрешения не удается:

/// <summary>Method to invoke when user attempts action without relevant permission</summary> 
    /// <param name="httpContext">the httpcontext</param> 
    /// <returns>empty result</returns> 
    public ActionResult InvokeHttp401(HttpContextBase httpContext) { 
     Transfer("/error/unauthorised"); 
     return new EmptyResult(); 
    } 

    private void Transfer(string url) { 
     var uriBuilder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port, Request.ApplicationPath); // Create URI builder 
     uriBuilder.Path += url; // Add destination URI 
     string path = Server.UrlDecode(uriBuilder.Uri.PathAndQuery); // Because UriBuilder escapes URI decode before passing as an argument 
     this.HttpContext.RewritePath(path, false); // Rewrite path 
     HttpContext.Server.TransferRequest(path, true); 
    } 

Примечание. Я использую Server.TransferRequest, чтобы попытаться вернуть результат 401 на текущий URL-адрес, не вызывая перенаправления. Я проверяю разрешение на регулярной ActionResult следующим образом:

[Authorize] 
public ActionResult MyMethod() { 
    if (!UserHasPermission(Admin)) 
    return InvokeHttp401(HttpContext); 
    ...... 

Где авторизированным тег будет перенаправлять для входа, если пользователь не вошел в систему, других разрешений, производится проверка.

С приведенной выше настройкой я могу вернуть результат 401 и остаться на текущем URL-адресе, но вместо текущей страницы отображается ошибка IIS 401.

Я также попытался установить следующее в моем файле web.config:

<httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace"> 
     ..... 
     <error statusCode="401" responseMode="ExecuteURL" path="/Error/unauthorised" /> 
    </httpErrors> 

Но это не имеет никакого значения. Я могу заставить пользовательскую неавторизованную страницу отображаться, если я не устанавливаю код состояния в свой Http401 ActionResult, но он просто возвращается с результатом 200.

Я посмотрел сообщения на этом question (в частности, ответ Тимоти, который расширил теги авторизации), но не смог получить ни одно из этих действий без аналогичных ошибок, как уже описано.

Может кто поможет здесь?

ответ

3

Фигурного это, наконец, -

Используя сочетание Выборочного санкционировать тег, как предложил Тимоти в связанном вопросе, и это blog post, я могу временно установить код состояния 418, а затем изменить его вернуться к 401 в Global.End_Request.

Одна последняя вещь, которую я должен был сделать, это добавить 418 к моей web.config и использовать режим PassThrough:

<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough"> 
     <remove statusCode="404" /> 
     <error statusCode="404" responseMode="ExecuteURL" path="/Error/not-found" /> 
     <remove statusCode="500" /> 
     <error statusCode="500" responseMode="ExecuteURL" path="/Error/error" /> 
     <remove statusCode="401" /> 
     <error statusCode="401" responseMode="ExecuteURL" path="/Error/unauthorised" /> 
    </httpErrors> 

И я получаю 401 результат на том же URL, а также мой настраиваемое представление ,

+1

С помощью Интернета вещей, которые я буду ОЖИДАТЬ, и НАДЕЕТСЯ, что кто-то будет достаточно умен, чтобы реализовать кофеварку, которая поставляется с чайником, который отправляет 418, когда вы кладете его на держатель.Также я не вижу, что вы добавляете 418 в свой web.config – Luminous

Смежные вопросы