2012-03-12 3 views
1

Я искал (пробовал, даже) для ответа на этот вопрос, но пока не придумал ничего полезного. Я довольно новичок в ADFS, STS в целом и WIF, поэтому, пожалуйста, извините любое очевидное незнание или неправильное использование терминологии. ;)Как увидеть статус переадресации с STS/IdP

Я в настоящее время интегрирую пользовательское приложение MVC3 с внешним IdP через ADFS. Настройка ADFS для IdP выполняется и работает.

Некоторые части сайта доступны для пользователей anon - в режиме аутентификации web.config установлено значение none. Другие части защищены, если их контроллеры/методы действий оформлены пользовательским System.Web.Mvc.AuthorizeAttribute.

Все обычные модификации web.config для использования WsFederationAuthenticationModule выполнены и работают на 95%; пользователь может перейти к анонимным частям сайта. Когда они пытаются ударить защищенные части, атрибут authorize проверяет, есть ли у них некоторая пользовательская информация из нашего IdP в IClaimsPrincipals, связанная с HttpContext.Current.User, а затем устанавливает ActionResult в 401, если нет; WsFederationAuthenticationModule запускает и перенаправляет их на страницу входа IdP. Когда они вводят свои данные, они затем успешно перенаправляются с некоторыми кукидами FedAuth, и затем авторизация переходит.

Проблема начинается, когда они попадают на страницу входа IdP. Этот конкретный IdP имеет ссылку, чтобы вернуть вас прямо на наш сайт (на ту же страницу, на которую был сделан первоначальный запрос), причем этот ответ SAML внедрен где-то (это соответствует их документации)

urn: oasis: names: tc: SAML: 2.0: status: AuthnFailed

На данный момент они теперь «неавторизованные», и все пользователи будут видеть (по крайней мере, в dev) страницу 401. Вы должны убить сеанс или иначе избавиться от этого файла cookie, чтобы начать заново.

Что мне нужно сделать, это перехватить запрос на переадресацию из IdP и, по существу, проверить этот статус SAML, потому что пользователь должен быть перенаправлен в одну из несанкционированных областей, как будто ничего не произошло. Я пытался что-то подобное в global.asax:

protected void Application_Start() 
    { 
     // mvc stuff here.... 

     // add handler to intercept handling creation of security tokens by WsFederationAuthnticationModule 
     FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated; 
    } 

    void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e) 
    { 
     FederatedAuthentication 
      .WSFederationAuthenticationModule 
      .SessionSecurityTokenCreated += WSFederationAuthenticationModule_SecuityTokenCreated; 
    } 

    public void WSFederationAuthenticationModule_SecuityTokenCreated (Object sender, SessionSecurityTokenCreatedEventArgs args) 
    {   
     var token = args.SessionToken; 
     // do something with the session token here e.g. check for SAML status 
    } 

.. но я не могу видеть что-нибудь полезное на этой лексемы; ничего не указывает на конкретный статус ответа. Тот факт, что есть файл FedAuth cookie на всех, но никакая пользовательская информация от Idp не мертва, отдайте, что пользователь был там, но каким-то образом не смог аутентифицироваться, но в принципе я хочу видеть этот статус. Мне, возможно, придется иметь дело с тайм-аутами в IdP, а также ...

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

Фуэ. Спасибо! : D

ответ

2

Хорошо, поэтому я собираюсь ответить на свой вопрос.

Ответ на вопрос, могу ли я получить этот пользовательский статус из моего IdP, на данный момент нет. :(

Но это связано только с тем, что ADFS не настроен для его захвата и передачи. Очевидно, вам нужно сделать какое-то пользовательское кодирование для захвата информации из обратного канала, который открывается между ADFS и IdP .... что выходит за рамки текущего объема работ.

В работе вокруг на данный момент:

  • Если запрос был сделан на сайт, и никакие SAML маркеров, его новый запрос пользователя, который не сделал никаких попыток аутентификации на IDP
  • Если есть SAML-маркер, но не ID из IdP в маркере (который присутствует только тогда, когда они AUTH должным образом), то пользователь не смог Auth по какой-то причине
    • Если есть SAML-маркер с идентификатором настоящий, пользователь правильно ответил

Не большой, но приемлемый. Кстати, вся заслуга YMC в этом SO посте на следующий код, который позволяет проверить SAML лексем:

void WSFederationAuthenticationModule_SecurityTokenReceived(object sender, SecurityTokenReceivedEventArgs e) 
    { 
     var message = SignInResponseMessage.CreateFromFormPost(Request) as SignInResponseMessage; 
     var rstr = new WSFederationSerializer() 
      .CreateResponse(message, 
      new WSTrustSerializationContext(
       SecurityTokenHandlerCollectionManager.CreateDefaultSecurityTokenHandlerCollectionManager())); 
    } 

PCE!

+0

К сожалению, этот код должен быть в global.asax – oolong

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