Настройте STS, но сохраняйте аутентификацию с помощью форм в веб-приложении - PullRequest
4 голосов
/ 08 марта 2012

Я включаю основание идентификации Windows в существующем веб-приложении.

Я хочу как можно меньше связываться с существующим кодом, поэтому я хотел бы перейти на страницу входа, которая использует проверку подлинности с помощью форм, оставленную в приложении, и я просто соединяюсь с STS, если пользователь входит в приложение через определенную страницу, например "im_comming_from_some_other_site" .aspx».

в "im_comming_from_some_other_site.aspx" код будет выглядеть так:

Page_Load(...)
{
   if(verifyAgainstSTS()
   {
        FormsAuthentication.SetAuthCookie(<some_STS_Userid), ...)
        Response.Redirect("default.aspx")
   }
   else
   {
        Response.Redirect("http://<STS_server_name/<STS_service...etc>")
   }
}

Есть ли кто-нибудь, кто знает, можно ли это сделать и как? Любые ссылки на пример кода (если есть) высоко ценятся.

(Конечно, для определения того, что делать, когда истекает время аутентификации, потребуется некоторый код; либо перейдите на страницу локального входа в систему или перейдите на страницу входа в систему STS)

Я знаю, что это может показаться плохим дизайном, не совсем подходящим для STS, но мне нужно реализовать это как можно скорее, и я хочу сохранить исходный сайт как можно более нетронутым.

1 Ответ

2 голосов
/ 08 марта 2012

Это неплохой дизайн, это ваше требование, и вы пытаетесь его выполнить.У нас есть рабочая система, построенная таким образом, и это не ракетостроение.Единственное отличие состоит в том, что мы переключаем его на формы / sam статически (через глобальные настройки), а не динамически.

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

На странице входа у вас есть два варианта.Каждый создает формы cookie как-то.Другой вариант включает управление WIF FederatedPassiveSignIn.

Если пользователь выполняет аутентификацию по формам, файл cookie установлен, и все готовоЕсли пользователь выполняет контроль входа в систему STS, рано или поздно он вернется с действительным токеном SAML.FederatedPassiveSignIn подберет его автоматически, и вы просто обработаете перенаправление в событии SignedIn.

Вам даже не понадобится if, который вы упомянули в своем вопросе.

Естьодно предостережение от того, что я помню.Когда пользователь проходит проверку подлинности с помощью STS, создается файл cookie WS-Federation, вы можете читать заявки и т. Д. Все работает.

Однако, если пользователь проходит проверку подлинности с помощью форм, SAM (SessionAuthenticationModule) заменит файл cookie ЗАМЕНИТЬс помощью файла cookie WS-Federation в конвейере ASP.NET после КАЖДОГО запроса (я полагаю, это потому, что SAM позже в конвейере, который формирует модуль аутентификации).

Это НЕ взорвет вашу context.User.Identity.IsInRole(...), также авторизация работаетправильно, потому что SAM будет копировать роли пользователей в соответствующие заявки.

Однако, если в каком-либо месте вашего кода вы пытаетесь извлечь информацию непосредственно из файла cookie форм (вместо использования общих API), вы можете обнаружить, чтоФайл cookie форм отсутствует, даже если пользователь прошел проверку подлинности с помощью форм в первую очередь (и файл cookie отсутствует, поскольку он будет заменен файлом cookie WS-Federation).

...