servicestack,request.servervariables,C#,Asp.net,servicestack,Request.servervariables" /> servicestack,request.servervariables,C#,Asp.net,servicestack,Request.servervariables" />

C# ServiceStack IHttpRequest.AbsoluteUri与浏览器客户端Uri不匹配

C# ServiceStack IHttpRequest.AbsoluteUri与浏览器客户端Uri不匹配,c#,asp.net,servicestack,request.servervariables,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) {

我有一个身份验证提供程序,它使用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
var req=authService.RequestContext.Get();
var u=new System.Uri(请求绝对URL);//https://service.com:80/auth/hmac
字符串clean=u.GetComponents(UriComponents.AbsoluteUri&~UriComponents.Port,UriFormat.UriEscape);
控制台。写入线(干净);//https://service.com/auth/hmac
也是您的客户端C#(就像在控制器中一样)。如果是这样,那么您可以从另一个URL(不带端口号)创建一个新的System.Uri,然后在该URL上执行ToString


这样,您就可以使用相同的解析直接比较URL。比剥离端口更好,因为它允许不同的端口号不同。

我不确定我是否理解您的意思。客户端假定没有端口。服务器绝对Uri返回带有端口的Uri。您的建议是:
var u1=新的UriBuilder(req.AbsoluteUri);string clean=u1.Uri.ToString()因为它也包括端口?主要原因是:“当端口是方案的默认端口时,此方法返回的字符串不包含端口信息。”(msdn.microsoft.com/en-us/library/system.uri.tostring.aspx)是的,我建议将比较中的两个uri实例化为system.uri。关于未返回的端口号的注释是不相关的,因为相同的URL将以完全相同的方式呈现,根据方法的规则显示或保留端口号。如果它们呈现的不同,那么一定会有不同。我想这就是我问题的重点。负载平衡器故意将端口添加到请求URI中。客户端发出的初始请求没有指定端口,因此进程失败。我建议的解决方案如上所述,但我一直在寻找这方面的改进,特别是已经内置到ServiceStack IHttpRequest中的解决方案,它是围绕Http.Current.Request的松散包装