2015-07-13 2 views
0

Я использую аутентификацию на основе OWIN в своем приложении MVC. Все мои контроллеры и методы действий защищены специальным атрибутом AuthorizeAttribute.ASP.Net MVC 5 - OWIN Аутентификация логина переадресация отображаемого сообщения

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

Возможно ли отобразить сообщение в этом случае? ... Может ли OWIN добавить параметр в запрос страницы входа (что-то вроде параметра ReturnUrl)?

Благодарим за помощь.

Edit:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class FunctionAuthorizeAttribute : AuthorizeAttribute 
{ 
    public IUserInformationService UserInformationService { get; set; } 
    public IGenericParameterService GenericParameterService { get; set; } 
    public String FunctionName { get; set; } 

    public FunctionAuthorizeAttribute(String functionName) 
    { 
     FunctionName = functionName; 
    } 

    protected override Boolean AuthorizeCore(HttpContextBase httpContext) 
    { 
     var parameter = GenericParameterService.GetCommonParameters(); 
     if (!parameter.CacheSecurityParameter) 
      parameter = GenericParameterService.GetCommonParameters(false); 

     return !parameter.EnableAuthentication || UserInformationService.HasAccess(FunctionName) 
    } 
} 
+0

Можете ли вы показать свой собственный атрибут? – Kamo

+0

@Kamo Конечно, но вы не найдете там ничего интересного ... Наверное. Я добавил код к вопросу. – musium

ответ

1

Использование можно использовать сессионный магазин. Обычно я сохраняю сообщения, которые будут отображаться на следующем экране в переменной сеанса (в виде списка). Макет страницы затем отвечает, чтобы отобразить соответствующее сообщение:

SessionMessage.AddMessage("Huh - you should login first", SessionMessage.MessageType.warning); 

с кодом в Views/Account/Login.cshtml:

@foreach (SessionEntry item in SessionMessage.GetSessionEntries()) 
{ 
    <div class="alert [email protected](Enum.GetName(typeof(SessionMessage.MessageType), item.MessageType).ToLower())"> 
     <button type="button" class="close" data-dismiss="alert"></button> 
     @item.Message 
     </div> 
} 

со всеми остальными here.

+0

Прохладно, спасибо большое – musium

+0

Возможно, вам лучше было бы сохранить ошибки в объекте TempData, поскольку он доступен только для одного запроса и затем автоматически очищается. – Derek

+0

У меня была проблема с TempData, что информация потерялась при нескольких перенаправлениях (особенно в контексте OWIN и Azure Active Directory). Поэтому я переключился на сеанс. –

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