2012-03-08 3 views
4

Я включаю основание идентификации Windows на существующем webapp.Настройте STS, но сохраните formauthentication в webapp

Я хочу испортить как можно больше с существующим кодом, поэтому мне бы хотелось, чтобы страница входа в систему, в которой используется формальная аутентификация, осталась в приложении, и я просто подключаюсь к 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, но мне нужно реализовать это как можно скорее, и я хочу, чтобы исходный сайт был как можно более нетронутым.

ответ

2

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

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

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

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

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

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

Однако, если пользователь аутентифицирован по формам, SAM (SessionAuthenticationModule) заменит cookie-файл cookie WS-федерации в конвейере ASP.NET по запросу EACH (я думаю, это связано с тем, что SAM позже в конвейере, модуль проверки подлинности форм).

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

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

+0

Звучит здорово, как мне это сделать? Либо я ставлю FederatedPassiveSignIn на мою страницу входа или ...? Нужно ли устанавливать какой-либо модуль, добавляя что-то в web.config и т. Д.? – mortb

+0

Ну, оба. Вам нужны «SessionAuthenticationModule» и «FederatedPassiveSignIn». Вы можете прочитать один из моих уроков http://netpl.blogspot.com/2011/08/quest-for-customizing-adfs-sign-ing-web.html –

+0

Это действительно помогло мне. Наш сайт уже получил «полу» SSO, обменяв файлы cookie с проверкой подлинности на другом сайте. Я добавил SSO с элементом управления FederatedPassiveSignin, и как SSO, так и cookie cookie с общедоступными формами все еще работает! – mortb