【问题标题】:How can I get fragment value from server side? [closed]如何从服务器端获取片段值? [关闭]
【发布时间】:2022-04-05 15:05:47
【问题描述】:

我的网址是:

http://localhost:4567/Test/Callback#state=test&access_token=....

但是当调用Request.Url.ToString(); 时它只是输出

http://localhost:4567/Test/Callback

如何将完整的 url 发送到服务器?

【问题讨论】:

  • myUrl.Substring(myUrl.IndexOf('#') + 1)
  • 我是说这是一个非常基本的问题,你自己研究这个问题可能比在这里提问更有好处。
  • 对不起,我还需要获取 url:"localhost:4567/Test/Callback#state=test&access_token=...."
  • @DmitryBychenko:不,哈希不会发送到服务器。因此,您的子字符串没有用处。

标签: c# asp.net


【解决方案1】:

你不能。

哈希 (#) 和查询字符串 (?) 之间存在很大差异。查询字符串被发送到服务器,哈希不是。

所以发送到服务器的urlhttp://localhost:4567/Test/Callback.

您必须将“哈希”发送到服务器的唯一选择是使用查询字符串:

http://localhost:4567/Test/Callback?state=test&access_token=...

【讨论】:

  • 正确! Fiddler 甚至不允许在 GET 请求中使用 # 符号。
  • 你说得对。感谢您的确认。
  • 谢谢,这是 google OAuth 回调,所以我不能编辑它。
  • 那么没有办法得到它,没有一些javascript废话。
【解决方案2】:
var uri = new Uri("http://localhost:4567/Test/Callback#state=test&access_token=....");

// Contains the query
uri.Fragment

结果:

#state=test&access_token=....

编辑:

获取网站当前使用的url:

Request.Url.AbsoluteUri;

Request.Url中是当前页面的所有信息,Request.Url中是上一页的所有信息。

注意:当没有先前的请求(来自您的网站)时,Request.UrlReferrer 为空

【讨论】:

【解决方案3】:

其他人已经针对您的具体问题发布了答案。

但您似乎正在开发一个 ASP.NET 网站,因此您应该考虑使用标准的 ? 而不是 # 来为您的查询字符串添加前缀。

这将允许您使用内置的方法和属性来处理查询字符串,并避免自定义容易出错的字符串处理:

string queryString = Request.Url.Query; // gives you "state=test&access_token=...."

或将其作为 NameValueCollection 访问:

string state = Request.QueryString["state"]; // gives you "test"

【讨论】:

  • 出于某种原因,OAuth 提供者似乎返回了一个包含访问令牌的片段 (#),而不是使用查询字符串 (?)。我在 ForgeRock 中看到了这个问题,看起来 Google OAuth 的工作方式相同。我不知道他们为什么将其作为标准。
  • @GalacticCowboy 原因是增加了安全性。 # 片段仅存在于客户端,不会通过网络传输,并且由于您使用的特定 OAuth 流程适用于客户端应用程序(我猜是隐式流程),因此服务器不需要无论如何都要访问它,所以它是有道理的。有关更多信息,请参阅this。还有授权代码流(现在到处推荐),您可以在服务器获取访问令牌的地方使用。
【解决方案4】:
var url=@"http://localhost:4567/Test/Callback#state=test";
var uri = new Uri(url);
var result = uri.Fragment;

【讨论】:

    【解决方案5】:

    您可以使用 javascript 获取完整链接,然后将其传递给后面的代码

    <script language="javascript" type="text/javascript">
    
        function JavaScriptFunction() {
            document.getElementById('<%= hdnResultValue.ClientID %>').value = document.URL;
        }
    
    </script>
    
    <asp:HiddenField ID="hdnResultValue" Value="0" runat="server" />
            <asp:Button ID="Button_Get" runat="server" Text="run" OnClick="Button_Get_Click" OnClientClick="JavaScriptFunction();" />
    

    然后从后面的代码中获取包含当前完整 URL 的 hiddenfield 的值

    protected void Button_Get_Click(object sender, EventArgs e)
    {
       string fullURL = hdnResultValue.Value;
       string URl = fullURL .Substring(fullURL .IndexOf('#') + 1);
    }
    

    祝你好运

    【讨论】:

    • 这是一个带有 C# 标签的问题。您不知道这是否在 Web 环境的上下文中。它可能是一个控制台应用程序调用一个 api 或其他东西。
    • 我认为其他答案下方的 cmets 表示这是一个基于网络的问题
    • 抱歉,我也只看到 cmets 要求提供 url。从来没有提到过网络环境。
    猜你喜欢
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2019-08-10
    • 2021-05-06
    • 2019-09-23
    • 2011-01-20
    相关资源
    最近更新 更多