【问题标题】:ServiceStack IHttpRequest.AbsoluteUri does not matched browser client UriServiceStack IHttpRequest.AbsoluteUri 与浏览器客户端 Uri 不匹配
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 我不确定我是否关注你。客户端假定没有端口。服务器 AbsoluteUri 返回带有端口的 Uri。您是否建议:var u1 = new 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 的松散包装器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2021-04-23
    • 2015-07-18
    • 2019-06-13
    • 2016-05-08
    相关资源
    最近更新 更多