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