2015-09-03 2 views
1

Моя конфигурация ADFS исключает всех пользователей, не принадлежащих к набору групп.Перенаправить пользователя на пользовательскую страницу, если он не авторизовался при использовании ADFS и ASP.NET MVC

Есть ситуации, когда пользователь входит в систему с помощью ADFS на веб-приложения (веб-приложение B) и дается набор требований, которые не содержат каких-либо групп, принятых в веб-приложении А.

Затем пользователь переходит в веб-приложение A, перенаправляется на ADFS, у пользователя уже есть файл cookie для ADFS, поэтому ему не предлагается новая комбинация пользователей и паролей, и он сразу же перенаправляет те же претензии (заявки веб-приложения B) в веб-приложение A.

Это приведет к появлению 401 в веб-приложении A, что является правильным.

Как мы можем перенаправить пользователя на страницу, объясняющую, что только что произошло (с кнопкой «Войти с другой учетной записью»)?

Для справки конфигурации web.config, что исключает все пользователи, которые не принадлежат к набору групп:

<authentication mode="None" /> 
<authorization> 
    <allow roles="GroupA,GroupB,GroupC,GroupD"/> 
    <deny users="*" /> 
</authorization> 

ответ

0

В случае, если кто-то должен иметь дело с этим, так я получил, чтобы показать пользовательскую несанкционированную страницу.

Создайте пользовательскую несанкционированную страницу, возможно, там выйдите из системы, я поместил мой в ErrorController и назвал действие Несанкционированным.

Первый «белый список» обычай «вы не имеете права» страница в web.config

<location path="Error/Unauthorized"> 
    <system.web> 
     <authorization> 
      <allow Users="*"/> 
     </authorization> 
    </system.web> 
</location> 

Примечание: если вы используете ReSharper будет подчеркнуть, что путь «Error/Несанкционированные» не существует , Просто игнорируйте это, потому что, если вы используете веб-формы, этот путь будет отображаться в физическом файле, но с MVC это не так.

Если вы хотите, чтобы позволить пользователю выйти так, что он/она может войти с другой учетной записи, вы должны также настроить выход из системы URL, как не имеющие каких-либо требований в отношении групп:

<location path="Home/Logout"> 
    <system.web> 
     <authorization> 
      <allow Users="*"/> 
     </authorization> 
    </system.web> 
</location> 

Теперь вы должны обрабатывать запросы, которые доходят до конца «конвейера» с помощью 401 «Неавторизованный», если пользователь аутентифицирован, и перенаправлять их на пользовательскую несанкционированную страницу:

В global.asax зарегистрируйте событие на EndRequest и выполните чеки, изменить ответ на 302 Найдено (временный переадресация) на пользовательскую неавторизованную страницу:

т е р:

protected MvcApplication(){ 
    EndRequest+=(s, e) => 
    { 
    if (Response.StatusCode == 401 && User.Identity.IsAuthenticated) 
    { 
     Response.StatusCode = 302; 
     Response.Headers.Add("Location", VirtualPathUtility.ToAbsolute("~/Error/Unauthorized")); 
    } 
    } 
} 

System.Web.VirtualPathUtility очень полезно здесь, потому что он расширяет ~ и генерирует полный адрес

Заголовок место просто имя заголовка, который используется в браузере, когда он получает ответ 302. Затем он выполнит запрос к URL-адресу, который является значением заголовка.

Я был убежден, что WSFederationAuthenticationModule выполнит этот сценарий с настройкой в ​​web.config, но я действительно не смог его найти.

Для справки вот все настройки в web.config вместе взятые:

<configuration> 
... 
    <location path="Error/Unauthorized"> 
     <system.web> 
      <authorization> 
       <allow Users="*"/> 
      </authorization> 
     </system.web> 
    </location> 
    <location path="Home/Logout"> 
     <system.web> 
      <authorization> 
       <allow Users="*"/> 
      </authorization> 
     </system.web> 
    </location> 
    <system.web> 
     <authentication mode="None" /> 
     <authorization> 
      <allow roles="GroupA,GroupB,GroupC,GroupD"/> 
      <deny users="*" /> 
     </authorization> 
     ... 
    </system.web> 
    <system.identityModel> 
    .... 
0

Укажите страницу для перенаправления для 401:

<customErrors mode="On"> 
    <error code="401" path="401.cshtml" /> 
</customErrors> 

Сделайте свой материал авторизации на странице 401.

+0

К сожалению, это не работает. Фактический код ошибки, который используется в этой ситуации, равен 401.2, и он никогда не соответствует параметру customErrors 401. Также я считаю, что это 'redirect' вместо' path', и вы не можете перенаправить непосредственно на страницу '.cshtml' (нет http-обработчик для этого). Было бы выполнено действие контроллера (redirect = «Ошибка/Несанкционированное»), но опять же, попробовал это, и перенаправление никогда не произойдет. – Rui

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