ServiceStack IHttpRequest.AbsoluteUri与浏览器客户端Uri

时间:2015-10-15 13:36:06

标签: c# asp.net servicestack request.servervariables

我有一个身份验证提供程序,它使用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

正在转换为AbsoluteUri:

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

1 个答案:

答案 0 :(得分:0)

你的客户端也是C#(就像在控制器中一样)。如果是这样,那么你可以从你的其他URL(没有端口号)创建一个新的System.Uri,然后在那里做一个ToString。

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