Единый вход с WIF - PullRequest
       8

Единый вход с WIF

5 голосов
/ 05 сентября 2011

Я успешно интегрировал единый вход с WIF на двух веб-доменах. Теперь у меня есть требование, чтобы некоторые пользователи входили в систему с помощью SSO, а другие не использовали SSO. Как мне этого добиться?

Буду признателен за вашу помощь,

Спасибо

Шахрам Джавед

1 Ответ

12 голосов
/ 12 сентября 2011

Ваш вопрос немного расплывчат, поэтому, возможно, это не правильный ответ.Позвольте мне связать нашу историю (с которой Эугенио помог) с надеждами, что она поможет ОП или кому-то еще.Я интерпретирую «не для другого пользователя» как то, что некоторые пользователи не используют единый вход: предположительно, они используют проверку подлинности с помощью форм или что-то другое.

Мы используем WIF для единого входа в веб-приложении, которое также поддерживает Wi-Fiверсия аутентификации форм.

Если кто-то заходит на страницу входа и предоставляет имя пользователя и пароль, мы используем WIF для установки самостоятельно выданного ClaimsPrincipal.По сути, сайт предъявляет претензии к себе.FederatedAuthentication используется так же, как обычно используется FormsAuthentication: установить cookie, используя статический метод для FederatedAuthentication.Немного другой, но в основном тот же принципал.

var token = FederatedAuthentication.SessionAuthenticationModule
    .CreateSessionSecurityToken(claimsPrincipal, "MyApp.Token",
    DateTime.UtcNow, DateTime.UtcNow.AddDays(7), false);
FederatedAuthentication.SessionAuthenticationModule
    .AuthenticateSessionSecurityToken(token, true);

Наше веб-приложение использует одного доверенного поставщика (сервер ADFS, который ведет переговоры с N федеративными партнерами).Нам нужен собственный способ решить, следует ли перенаправлять неаутентифицированных пользователей на страницу входа или в ADFS для пользователей единого входа.Мы отключаем пассивное перенаправление, чтобы WIF автоматически не отправлял людей в ADFS.

<wsFederation passiveRedirectEnabled="false"
    issuer="https://adfs.ourplace.com/adfs/ls/"
    realm="http://www.ourplace.com" .../>

Здесь мы используем атрибут аутентификации (мы используем ASP.NET MVC, но все, что вам подходит).

public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
            return; // all good

        RedirectTo(IsSSO() ? GetADFSUrl() : GetSignInUrl();
    }
}

Чтобы определить, является ли пользователь SSO-пользователем или нет, когда он не прошел проверку подлинности, это проблема обнаружения Home Realm Realm.Разные люди решают это по-разному.Для нас, когда пользователь единого входа впервые подключается к системе с помощью единого входа, мы записываем постоянный файл cookie со своей домашней областью (который является идентификатором поставщика утверждений в ADFS).Если cookie отсутствует, они переходят в «Войти».Если файл cookie присутствует, он перенаправляется в ADFS.URL-адрес:

var adfsEntryPoint = FederatedAuthentication.WSFederationAuthenticationModule.Issuer;
var wtRealm = FederatedAuthentication.WSFederationAuthenticationModule.Realm;
var whr = <from home realm cookie>
var redirectUrl = string.Format("{0}?wa=wsignin1.0&wtrealm={1}&whr={2}",
    adfsEntryPoint,
HttpContext.Server.UrlEncode(wtRealm),
HttpContext.Server.UrlEncode(whr));

Если вы перенаправляете напрямую на N федеративных партнеров, возможно, сохраните URL-адрес обновления токена в файле cookie.

...