【发布时间】:2015-10-15 13:36:05
【问题描述】:
我有一个身份验证提供程序,它使用 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 以去除端口号?后者似乎有点hacky。
更新:
我知道这行得通,但有更好的方法吗?
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
【问题讨论】:
标签: c# asp.net servicestack request.servervariables