Как мне обработать событие SessionSecurityTokenReceived в Global.asax? - PullRequest
5 голосов
/ 14 ноября 2011

Я пытаюсь настроить скользящие сеансы в WIF и мне нужно обработать SessionSecurityTokenReceived .

Я уверен, что я делаю что-то глупое здесь ... но VS2010 продолжает говорить мне, что There is no applicable variable or member в месте, показанном ниже. Может кто-то указать мне верное направление? Я искал все выше и ниже фактические примеры того, как определить обработку этого события, но я не могу найти ни одного.

Global.asax

protected void Application_Start()
{

    FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenReceived 
           += SessionAuthenticationModule_SessionSecurityTokenReceived;
     //         ^^^ There is no applicable variable or member
}



void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
            DateTime now = DateTime.UtcNow;
            DateTime validFrom = e.SessionToken.ValidFrom;
            DateTime validTo = e.SessionToken.ValidTo;
            if ((now < validTo) &&
            (now > validFrom.AddMinutes((validTo.Minute - validFrom.Minute) / 2))
            )
            {
                SessionAuthenticationModule sam = sender as SessionAuthenticationModule;
                e.SessionToken =  sam.CreateSessionSecurityToken(
                    e.SessionToken.ClaimsPrincipal, 
                    e.SessionToken.Context,
                    now,
                    now.AddMinutes(2), 
                    e.SessionToken.IsPersistent);
                e.ReissueCookie = true;
            }
            else
            {
                //todo: WSFederationHelper.Instance.PassiveSignOutWhenExpired(e.SessionToken, this.Request.Url);

                // this code from: /5007203/kak-ustanovit-srok-deistviya-slaidov-v-prilozhenii-mvc-kotoroe-ispolzuet-sts-wif-dlya-autentifikatsii

                var sessionAuthenticationModule = (SessionAuthenticationModule)sender;

                sessionAuthenticationModule.DeleteSessionTokenCookie();

                e.Cancel = true;
            }
  } 

Ответы [ 2 ]

9 голосов
/ 15 ноября 2011

Не думаю, что вам нужна подписка на событие.Удалите подписку при запуске и просто используйте

SessionAuthenticationModule_SessionSecurityTokenReceived

. ASP.Net свяжет это для вас.(Модуль должен называться «SessionAuthenticationModule» и он по умолчанию).

Если вы работаете над скользящими сессиями, этот пост в блоге Витторио довольно хорош:

0 голосов
/ 15 ноября 2011

Вместо определения его в Global.asax, создайте новый класс, который наследует SessionAuthenticationModule:

public class CustomAuthenticationModule : SessionAuthenticationModule
{
   public CustomAuthenticationModule()
   {
      this.SessionSecurityTokenReceived += new EventHandler<SessionSecurityTokenReceivedEventArgs>(CustomAuthenticationModule_SessionSecurityTokenReceived); 
   }

   void CustomAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
   {
      // Your code
   }
}

Затем в вашем web.config замените модуль SessionAuthentication по умолчанию на новый:

<modules>
   <add name="SessionAuthenticationModule" type="CustomAuthenticationModule" preCondition="managedHandler"/>
</modules>
...