【问题标题】:MVC Redirect with custom headers带有自定义标头的 MVC 重定向
【发布时间】:2013-08-04 06:21:03
【问题描述】:

希望这是一个简单的问题。

基本上在收到对我的 MVC 控制器的请求后,我想:

  1. 在响应中添加“授权”标头
  2. 重定向到另一个域中的另一个应用程序
  3. 阅读此外部站点的“授权”标头。

这似乎是重定向的行为,去掉了我所有的自定义标头和重定向。

我的问题是,如何添加新标头并执行重定向,并让该标头显示在标头中以供接收主机 [在重定向结束时] 读取?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 model-view-controller http-headers


    【解决方案1】:

    否 - 302 重定向由浏览器处理,它不会重新附加标头。

    选项:

    • 服务器端代理
    • 使用 cookie 而不是其他标头(如果是同一个域,则不是您的情况,每 2 个)
    • 手动重定向客户端(可能没问题,因为您仍然在进行 AJAX 调用)。

    【讨论】:

    • 告诉我更多关于这个“手动重定向客户端(可能没问题,因为你无论如何都在进行 AJAX 调用)。”
    • 我喜欢这个主意...告诉我更多关于这个“手动重定向客户端”的信息(可能没问题,因为无论如何您都在进行 AJAX 调用)。我需要设置 auth header 并让它在新窗口或标签中打开。
    • @user1265146 - “手动”从您的服务器获得正常的 200 响应,其中包含类似{header:XXXX, location:url} 的内容,并向该位置发出第二个 AJAX 请求。现在,由于您可能想要发布到其他域,您可能根本无法发出该请求(除非其他域支持 CORS)。
    【解决方案2】:

    你不能。这不是 HTTP 的工作方式。首先,“重定向”只是一个 301、302 或(从 HTTP 1.1 起)307 状态代码,其中 Location 标头设置为客户端应该访问的 URL。 client 发起对该 URL 的请求,因此您无法控制它们发送的标头。

    其次,HTTP 是无状态的,因此在某个时间点在某些响应中发送了 Authorization 标头这一事实与任何未来请求中发生的任何事情相关。 Web 浏览器和其他 HTTP 客户端通过使用服务器端的会话和客户端的 cookie 来绕过 HTTP 的无状态特性。客户端将 cookie 与请求一起发送到服务器。 cookie 匹配服务器上会话存储中的一个项目,服务器从该会话加载数据,以呈现好像状态保持不变的外观。

    第三,cookie 在这种情况下不起作用,因为它们是域绑定的,不会与请求一起发送到它们并非源自的域。因此,即使您要创建会话来维护授权,其他站点也永远不会看到它。

    FWIW,这里的基本前提,与不同的域共享身份验证状态,正是开发 OAuth 等技术的目的。因此,将未来的研究引向这个方向。

    【讨论】:

    • @chrris 谢谢你非常彻底的回复。我实际上正在使用 OAuth,但是在一个非常具体的用例中,我们不重定向登录,它全部由“受信任的应用程序”处理,现在我想将令牌粘贴到标题中,以便另一个“受信任的应用程序” ' 可以阅读声明并进行相应的处理......所有这些都无需重定向到 idP。 Alexei 提到在客户端执行此操作,这是可能的,因为我在客户端上有令牌。我只需要能够添加身份验证标头并在新选项卡/窗口中触发请求。我认为这是可能的?
    • 您所描述的是 OAuth 和 HTTP 作为协议故意不允许的内容。不是决定什么是“受信任的应用程序”,而是用户。这是通过与已知实体的身份验证来完成的。一旦涉及到不同的实体,则再次需要进行身份验证,因为用户不信任该新实体。没有办法绕过这个设计。能够做到这一点将是一个巨大的安全漏洞。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2011-08-20
    • 2011-09-20
    • 2017-12-28
    • 2011-03-03
    • 2014-02-18
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多