【问题标题】:How to Set Sliding Expiration in my MVC app that uses STS (WIF) for authentication如何在使用 STS (WIF) 进行身份验证的 MVC 应用程序中设置滑动过期
【发布时间】:2016-01-28 23:21:14
【问题描述】:

我们正在使用 STS 开发 MVC 应用程序。我们使用 WIF 工具创建了一个用于开发的简单 STS 应用。

我希望能够在我的令牌(在 RP 中)中设置滑动到期。

我看到代码like here

不幸的是,这是事件处理程序,示例虽然很有帮助,但并未说明如何实现处理程序!

在我的 global.asax 中,Application_Start() 我有:

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

(sam 使用类范围定义。)

我不确定这是否正确。由于 global.asax 中的调试问题,我不知道如何验证是否曾调用过该事件。

是否有更完整的示例说明如何捕获此事件?我的方法正确吗?

TIA!感谢您的帮助! 丰富

编辑 - 好吧,我知道事件没有被调用,因为我在处理程序中放置了除以零的代码,并且应用程序没有引发异常。我通过我的 STS 登录,所以任何收到令牌的事件都应该被触发。

任何有关如何执行此操作的帮助将不胜感激。谢谢!

【问题讨论】:

    标签: c# security model-view-controller


    【解决方案1】:

    由于 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=5211

    【讨论】:

      【解决方案2】:

      虽然 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; 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多