none
如何更新 FormsAuthentication 票据 RRS feed

  • 问题

  • 我用可调过期的Cookie保存登录信息,登录之后一直不退出,票据会在一定时间后过期,导致访问认证页面时出错。我想问问如何在过期之后能自动更新票据? FormsAuthentication.RenewTicketIfOld 这个方法应该可以,但需要知道旧的 Ticket 。怎么才可以得到旧的 Ticket 呢?现在只能从页面获取到之前保存的 Cookie ,也不知道是谁登录了,不知道怎么才可以得到之前的 Ticket 。是不是只能使用不可调过期,或者只能让用户重新登录吗?是否能够不重新登录而可以直接更新票据登录信息呢?从而不会中断需要认证页面的访问?

    2008年10月21日 13:23

答案

  •  

    <forms name="name" loginUrl="URL" slidingExpiration="true">
    </forms>

    slidingExpiration

    指定是否启用可调过期时间。可调过期将 Cookie 的当前身份验证时间重置为在单个会话期间收到每个请求时过期。

    此属性可以为下列值之一。

    True :指定启用可调过期时间。在单个会话期间,身份验证 Cookie 被刷新,并且每个后续请求的到期时间被重置。
     
    False : 指定不启用可调过期,并指定 Cookie 在最初发出之后,经过一段设定的时间间隔后过期。
     

     

    2008年10月21日 13:31
    版主

全部回复

  •  

    <forms name="name" loginUrl="URL" slidingExpiration="true">
    </forms>

    slidingExpiration

    指定是否启用可调过期时间。可调过期将 Cookie 的当前身份验证时间重置为在单个会话期间收到每个请求时过期。

    此属性可以为下列值之一。

    True :指定启用可调过期时间。在单个会话期间,身份验证 Cookie 被刷新,并且每个后续请求的到期时间被重置。
     
    False : 指定不启用可调过期,并指定 Cookie 在最初发出之后,经过一段设定的时间间隔后过期。
     

     

    2008年10月21日 13:31
    版主
  •  

    是不是只能这样设置啊?不能通过程序人为控制 Renew 吗?那么如果用 RenewTicketIfOld 这个方法,怎么才能获取到旧的 Ticket 啊?
    2008年10月21日 17:13
  • 还有比较奇怪的,我在本机调试,登录之后几个小时(已超过了timeout时间)不进行任何操作,只要不关浏览器,从来不会出错;但放到服务器上就会在timeout时间后超时出错。错误如下:

     

    [CryptographicException: 填充无效,无法被移除。]
       System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) +7594654
       System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) +208
       System.Security.Cryptography.CryptoStream.FlushFinalBlock() +33
       System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo) +225
       System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) +246

    我是把登录信息放在票据里加密后,添加入Cookie保存的。在需验证的页面,首先判断Cookie是否存在,若存在便调用 Decrypt 方法解密登录信息(在这一步能否判断票据是否已过期?)。票据过期与Cookie过期的时间是一样的,应该说两者会同时过期,或者票据后于Cookie过期才对。但现在是票据先过期了,而没办法解密之前的加密信息导致出错。

     

    有点不解的便是本机与服务器为何会出现不同的情况?二者的 .Net 环境一样,只是一个是 server 2003,一个是 server 2008 。

     

     

    另外,我设置了 slidingExpiration="true" timeout="240" ,但还没到两个小时就出现上面的错误了。

    2008年10月22日 3:14