通过受限访问 URL 从另一个站点访问一个站点的问题

Posted

技术标签:

【中文标题】通过受限访问 URL 从另一个站点访问一个站点的问题【英文标题】:Issue in accessing one site from another site through limited access URL 【发布时间】:2020-05-05 14:29:37 【问题描述】:

我有两个网站,都在不同的域中。所以例如http://example1.com 和 http://example2.com。这两个站点都在 ASP .NET 中并使用 Forms 身份验证。 example1.com 的用户需要访问 example2.com 的某些资源,而无需在 example2.com 中拥有帐户。因此,每当 example1.com 的用户需要访问 example2.com 中的资源时,都会生成一个临时 URL,用户可以通过该 URL 访问该资源。该 URL 是限时使用的 URL,在第一次使用后失效。这是它的工作原理。

    当 example1.com 需要访问 example2.com 端的资源时,会发生 response.redirect,并在查询字符串中使用加密令牌。例如http://example2.com/path/resource1/?token=encryptedToken 此令牌在 example2.com 端读取,如果有效,则表单身份验证设置为“临时用户”。 “临时用户”是专为 example.com 用户创建的受限访问用户。

下面是在 Application_AuthenticateRequest 事件中实现这一点的代码

protected void Application_AuthenticateRequest(object sender, EventArgs e)
   
    const string TempUser = "TempUser";
    if (!Request.IsAuthenticated)
                    
        var url = Request.Url;              
        var token = Request.QueryString["token"];

        if(IsKnownUrl(url) && IsValidToken(token))
        
            FormsAuthentication.SetAuthCookie(TempUser, false);
            Response.Redirect(Request.RawUrl);
        
    


private bool IsKnownUrl(string url)

    //Logic to check the url is from known sources


private bool IsValidToken(string token)

    //Logic to token is valid and not expired

在两个站点都切换到 SSL 之前,这一切正常。即https://example1.com 和https://example2.com。这停止了​​工作。从 example1.com 到 example2.com 的 Response.Redirect 进入 302 循环,这意味着由于某种原因未设置或接受身份验证 cookie。当我在 Chrome 浏览器开发者工具中查看网络活动时,我看到了以下线索

姓名状态

https://example2.com/path/resource1/?token=encryptedToken 302

https://example2.com/path/resource1/?token=encryptedToken 302

https://example2.com/path/resource1/?token=encryptedToken 302

........

浏览器终于​​放弃了,提示页面重定向次数过多。

对可能出现的问题有任何想法吗?

【问题讨论】:

您是否使用 Fiddler 检查过发生了什么,例如是否设置了 cookie? (如果您不知道 Fiddler 是什么,它是一个反向代理,它记录来自您的系统的原始 http 请求和响应、标头、正文等所有内容)。此外,您可能已经这样做了,但只需仔细检查您的所有 url 引用也已更新为 HTTPS,并且您设置的 cookie 的 Secure 属性设置为 true (此设置不应该有所作为,但只是尝试无论如何)。 【参考方案1】:

感谢 Aydin 的提示。对于同样面临类似问题的任何人,这是解决方案。

在与 Fiddler 核对后,我发现身份验证 cookie (.ASPXAUTH) 是从服务器发送的,但浏览器没有在后续请求中发送它们。 此外,来自 example2.com 的 URL 显示在 IFrame 内的 example1.com 中。经过一番搜索,我发现对于 IFrame,只有在 Set-Cookie 响应标头中指定了 "SameSite=None" 时,浏览器才会发送 cookie。

所以最后我不得不更新我的代码以手动创建 ASPXAUTH cookie,因为 FormsAuthentication 类创建的 cookie 将其设置为“Lax”。

【讨论】:

以上是关于通过受限访问 URL 从另一个站点访问一个站点的问题的主要内容,如果未能解决你的问题,请参考以下文章

无法通过域 URL 访问 Nginx 站点

从另一台机器访问 wordpress 站点

NGINX访问多个站点相同的IP url

限制站点仅访问 QR 扫描

即使在服务器上长时间不活动之后,如何确保可以通过 url 访问 Docker django 站点?

如何为用户“伪装”或“重命名”页面名称/位置/ URL,但仍允许外部站点通过HTTP_REFERER正确读取真实的URL