ServiceStack IHttpRequest.绝对Uri与浏览器客户端Uri不匹配

本文关键字:Uri 客户端 不匹配 浏览器 绝对 ServiceStack IHttpRequest | 更新日期: 2023-09-27 18:17:48

我有一个使用HMAC作为ServiceStack认证机制的认证提供者。

我使用IHttpRequest.AbsoluteUri来抓取Uri,但Uri不是我所期望的。由于Uri是我用于HMAC的HMAC基本字符串的核心部分,因此在我们的预生产服务器上验证失败。

private string BuildBaseString(IHttpRequest req, string accountCode, string username, string timestamp)
{
    var methodType = req.HttpMethod;
    var absoluteUri = req.AbsoluteUri;
    return string.Join("'n", methodType, timestamp, absoluteUri, accountCode, username).ToUpper();
}

我使用ServiceStack的了不起的日志功能记录一切。我的假设是,在REST客户端中输入的URL将与IHttpRequest.AbsoluteUri相同。然而,有一个小而重要的区别,我认为这是由于负载平衡器。

https://service.com/auth/hmac

正在被转换为绝对uri:

https://service.com:80/auth/hmac

(我可以在ServiceStack日志中看到这一点)

问题是,我应该使用更好的IHttpRequest属性来避免这种情况,或者我是否需要在c#中手动打破Uri以剥离端口号?后者似乎有点俗气。

更新:

我知道这是可行的,但是有更好的方法吗?

var req = authService.RequestContext.Get<IHttpRequest>();
var u = new System.Uri(req.AbsoluteUrl); // https://service.com:80/auth/hmac
string clean = u.GetComponents( UriComponents.AbsoluteUri & ~UriComponents.Port, UriFormat.UriEscaped );
Console.WriteLine(clean); // https://service.com/auth/hmac

ServiceStack IHttpRequest.绝对Uri与浏览器客户端Uri不匹配

是你的客户端c#太(像在一个控制器)。如果是这样,那么您可以创建一个新的系统。Uri从你的其他URL(没有端口号),然后做一个ToString。

通过这种方式,您将能够使用相同的解析直接比较url。比剥离端口要好,因为它允许不同的端口号是不同的。