Это неплохой дизайн, это ваше требование, и вы пытаетесь его выполнить.У нас есть рабочая система, построенная таким образом, и это не ракетостроение.Единственное отличие состоит в том, что мы переключаем его на формы / 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).