2011-11-14 20 views
5

Tôi đang cố thiết lập các phiên trượt trong WIF và cần xử lý SessionSecurityTokenReceived.Làm cách nào để xử lý sự kiện SessionSecurityTokenReceived trong Global.asax?

Tôi chắc chắn rằng tôi đang làm điều gì đó ngu ngốc ở đây ... nhưng VS2010 tiếp tục nói với tôi rằng There is no applicable variable or member tại chỗ được minh họa bên dưới. ai đó có thể chỉ cho tôi phương hướng đúng không? Tôi đã tìm kiếm cao và thấp cho các mẫu thực tế làm thế nào để xác định việc xử lý sự kiện này, nhưng tôi không thể tìm thấy một duy nhất.

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: http://stackoverflow.com/questions/5821351/how-to-set-sliding-expiration-in-my-mvc-app-that-uses-sts-wif-for-authenticati 

       var sessionAuthenticationModule = (SessionAuthenticationModule)sender; 

       sessionAuthenticationModule.DeleteSessionTokenCookie(); 

       e.Cancel = true; 
      } 
    } 

Trả lời

9

Tôi không nghĩ rằng bạn cần đăng ký sự kiện. Tháo subcription trên bắt đầu và chỉ cần sử dụng

SessionAuthenticationModule_SessionSecurityTokenReceived

ASP.Net sẽ dây đó cho bạn. (Module phải được đặt tên là "SessionAuthenticationModule" và nó là theo mặc định).

Nếu bạn đang làm việc trên phiên trượt, bài viết trên blog này bởi Vittorio là khá tốt: http://blogs.msdn.com/b/vbertocci/archive/2010/06/16/warning-sliding-sessions-are-closer-than-they-appear.aspx

+5

Dễ dàng và hoạt động như một sự quyến rũ! Làm thế nào tôi có thể cho biết sự khác biệt giữa các sự kiện cần nối dây và những sự kiện không cần thiết – LamonteCristo

0

Thay vì xác định nó trong Global.asax, tạo ra một lớp mới kế thừa SessionAuthenticationModule:

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

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

Sau đó, trong web.config của bạn, hãy thay thế mô-đun SessionAuthentication mặc định bằng mô-đun mới của bạn:

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

Cảm ơn bạn, gần đây tôi đã gặp phải một số cấu hình và điều này đã lưu ngày của tôi (tôi không có trang toàn cầu), mặc dù không phải là đặc biệt trong global.asax và nên có lẽ trong một số chủ đề khác, nhưng tôi không thể tìm thấy phần thông tin này ở đâu cả. – Mochi