Как установить срок действия слайдов в приложении MVC, которое использует STS (WIF) для аутентификации - PullRequest
4 голосов
/ 28 апреля 2011

Мы разрабатываем приложение MVC с использованием STS. Мы использовали инструменты WIF для создания простого приложения STS для разработки.

Я бы хотел установить скользящий срок действия в моем токене (в RP).

Я вижу код как здесь .

К сожалению, это обработчик событий, и пример, хотя и полезный, не показывает, как реализовать обработчик!

В моем global.asax Application_Start () у меня есть:

sam = new SessionAuthenticationModule();
        sam.SessionSecurityTokenReceived += 
            new EventHandler<SessionSecurityTokenReceivedEventArgs>(sam_SessionSecurityTokenReceived);

(sam определен с областью видимости класса.)

Я не уверен, правильно ли это. Я не знаю, как проверить, вызывалось ли событие когда-либо из-за проблем отладки в global.asax.

Есть ли где-нибудь более полный пример того, как отловить это событие? Правильно ли я делаю это?

ТИА! Я ценю помощь! Рич

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

Любая помощь в том, как это сделать, будет принята с благодарностью. спасибо!

Ответы [ 2 ]

8 голосов
/ 07 июня 2011

Поскольку WIF допускает только сеансы фиксированной длины, требуется переиздание токена безопасности, в какой момент вы можете установить, когда свойство токена IsValidTo токена соответствует тому, что вам требуется.

Поместите это в свой файл global.asax:

protected void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
    var sessionToken = e.SessionToken;
    SymmetricSecurityKey symmetricSecurityKey = null;

    if (sessionToken.SecurityKeys != null)
        symmetricSecurityKey = sessionToken.SecurityKeys.OfType<SymmetricSecurityKey>().FirstOrDefault();

    Condition.Requires(symmetricSecurityKey, "symmetricSecurityKey").IsNotNull();

    if (sessionToken.ValidTo > DateTime.UtcNow)
    {
        var slidingExpiration = sessionToken.ValidTo - sessionToken.ValidFrom;

        e.SessionToken = new SessionSecurityToken(
                    sessionToken.ClaimsPrincipal,
                    sessionToken.ContextId,
                    sessionToken.Context,
                    sessionToken.EndpointId,
                    slidingExpiration,
                    symmetricSecurityKey);

        e.ReissueCookie = true;
    }
    else
    {
        var sessionAuthenticationModule = (SessionAuthenticationModule) sender;

        sessionAuthenticationModule.DeleteSessionTokenCookie();

        e.Cancel = true;
    }
}

Источник: http://blogs.planbsoftware.co.nz/?p=521 1

1 голос
/ 28 января 2016

В то время как ответ от bmeredith выглядит совершенно верным, одна вещь выпирает.

Похоже, что токен обновляется при каждом запросе, а криптографические операции обычно недешевы. Я нашел похожий, но немного другой подход, который обновляет токен только после ½ сеанса.

Также мне нравится использование модуля SessionAuthenticationModule для создания токена, поэтому нам не нужно возиться с ключами.

http://www.cloudidentity.com/blog/2013/05/08/sliding-sessions-for-wif-4-5/

void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender,

System.IdentityModel.Services.SessionSecurityTokenReceivedEventArgs e)
{ 
    DateTime now = DateTime.UtcNow;
    SessionSecurityToken sst = e.SessionToken;
    DateTime validFrom = sst.ValidFrom;
    DateTime validTo = sst.ValidTo; 
    if ((now < validTo) && (now > validFrom.AddMinutes( (validTo.Minute - validFrom.Minute) / 2)) ) 
    { 
        SessionAuthenticationModule sam = sender as SessionAuthenticationModule;
        e.SessionToken = sam.CreateSessionSecurityToken(sst.ClaimsPrincipal,
                                                        sst.Context,
                                                        now,
                                                        now.AddMinutes(2),
                                                        sst.IsPersistent); 
                                                        e.ReissueCookie = true; 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...