none
如何实现可以使用相同的参数计算哈希,以确保它返回相同的结果 RRS feed

  • 问题

  • 你好,我看了“服务总线的共享访问签名身份验证”这一文档,里面提及到‘接收方便可以使用相同的参数计算哈希,以确保它返回相同的结果’,想请教一下,这个是如何实现的,如何判断SAS是否有效,SHA-256('https://<yournamespace>.servicebus.windows.cn/'+'\n'+ 1438205742) 如何判断这个是否在指定有效期内;如下,如何判断token是否有效

    public static  string createToken(string resourceUri, string keyName, string key)
            {
                TimeSpan sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
                var expiry = Convert.ToString((int)sinceEpoch.TotalSeconds + 3600);
                string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;
                HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));
                var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
                var sasToken = String.Format(CultureInfo.InvariantCulture,
                    "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
                    HttpUtility.UrlEncode(resourceUri),
                    HttpUtility.UrlEncode(signature),
                    expiry,
                    keyName);
                return sasToken;

    }       

    2017年9月22日 9:14

全部回复

  • 你好,

    --‘接收方便可以使用相同的参数计算哈希,以确保它返回相同的结果’,想请教一下,这个是如何实现的

    通过官方文档和你的代码可以看出SAS令牌是使用HMACSHA256 ComputeHash方法去得到哈希值的。

    --如何判断SAS是否有效,SHA-256('https://<yournamespace>.servicebus.windows.cn/'+'\n'+ 1438205742) 如何判断这个是否在指定有效期内;如下,如何判断token是否有效

    使用你的代码生成的SAS令牌如下:

    SharedAccessSignature sr=http%3a%2f%2fyournamespace.servicebus.windows.net%2fyourqueue&sig=w32oivu3vMVVk88aOmQ1i3%2f5sdPlwr3yoWp%2fe%2fUAd%2bk%3d&se=1506333432&skn=device_send_listen

    令牌当中包含了它的过期时间(你可以查看se 的值),你可以使用正则表达式或者字符串方法得到过期时间,然后使用datetime.add()方法去得到截止时间,例如:

                int seconds = 1506332099; //你可以从SAS令牌中得到
                DateTime dt = new DateTime(1970, 1, 1);
                dt = dt.AddSeconds(seconds); //得到截止时间,注意这里是UTC时间
    最后和当前UTC时间做对比,从而判断这个SAS令牌是否过期。

    2017年9月25日 9:08