【问题标题】:How to lock the token, Based on the time in asp.net?如何根据asp.net中的时间锁定令牌?
【发布时间】:2012-04-18 03:06:47
【问题描述】:

我使用以下程序生成令牌,基于时间(当前时间)。它工作正常,这意味着令牌将被生成。

         public string GenerateToken()
            {
                MD5 md5 = System.Security.Cryptography.MD5.Create();
                DateTime input = DateTime.Now;
                byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input.ToString());
                byte[] hash = md5.ComputeHash(inputBytes);

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < hash.Length; i++)
                {
                    sb.Append(hash[i].ToString("X2"));
                }
                return sb.ToString();
            }

我使用以下程序尝试在 2 分钟内锁定(过期)令牌。这意味着我访问了 GetToken() method,它将返回 particular Time(current Time) 的令牌。我需要设置有效时间 2 分钟对于那个令牌。如果我在 2 分钟之前访问 getToken(),我需要获得相同的令牌。但是我在 2 分钟后访问 getToken(),我需要获得新的令牌。我该怎么做?如何锁定令牌?

     public string GetToken()
        {
            DateTime currentTime = DateTime.UtcNow;               
            tokenExp = DateTime.UtcNow.AddMinutes(2);
            if (tokenExp >= currentTime)
            {
                token = GenerateToken();
                return token;
            }

            else lock (tokenLock)
                {
                    if (tokenExp >= currentTime)
                    {
                        token = GenerateToken();
                        //return token;

                    }
                    return token;
                }

【问题讨论】:

    标签: c# asp.net token access-token


    【解决方案1】:

    您正在使用散列,而您应该使用加密

    散列是一种方式,但加密是两种方式,即当您取回令牌时,您可以解密令牌以获得原始值,以便能够计算时间差并检查它是否大于 2 分钟。

    您可以使用 AES、3DES、...

    【讨论】:

    • 加密和散列仅用于生成令牌。正确吗?它是如何与锁定令牌相关的?
    • 您的锁定实现不实用——设计需要改变。我的回答可能无法回答您的问题,但我正在努力为您指明正确的方向。
    【解决方案2】:

    你应该在 GenerateToken 方法中使用类似下面的东西

     DateTime dateTime = DateTime.UtcNow;
     dateTime = dateTime.AddSeconds(-dateTime.Second);
     if (dateTime.Minute % 2 != 0)
         dateTime = dateTime.AddMinutes(1);
    

    这将生成偶数分钟的时间,这与 2 分钟的持续时间相同。

    更新

    完整代码

    public string GenerateToken()
    {
        MD5 md5 = System.Security.Cryptography.MD5.Create();
        DateTime dateTime = DateTime.UtcNow;
        dateTime = dateTime.AddSeconds(-dateTime.Second);
        if (dateTime.Minute % 2 != 0)
            dateTime = dateTime.AddMinutes(1);
    
        byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(dateTime.ToString());
        byte[] hash = md5.ComputeHash(inputBytes);
    
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }
    

    【讨论】:

    • 我尝试在 GetToken() 中生成锁定令牌
    • 无需获取任何锁。如上所示,修改您的 GenerateToken 方法以使用 dateTime。它会做的是,dateTime 将在两分钟内更改一次,而不是每秒/分钟。
    • 你能编辑那个 GenerateToken() 代码并回发吗?因为我无法理解你的意思。
    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 2018-10-21
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多