C# 通过受限访问URL从另一个站点访问一个站点时出现的问题

C# 通过受限访问URL从另一个站点访问一个站点时出现的问题,c#,asp.net,security,cross-domain,forms-authentication,C#,Asp.net,Security,Cross Domain,Forms Authentication,我有两个网站,都在不同的领域。例如,和。这两个站点都位于ASP.NET中,并使用表单身份验证。example1.com的用户需要访问example2.com的某些资源,而无需拥有example2.com中的帐户。因此,每当example1.com的用户需要访问example2.com中的资源时,就会生成一个临时URL,用户可以通过该URL访问该资源。URL是一个有限的一次性使用URL,在首次使用后无效。下面是它的工作原理 当example1.com需要访问example2.com端的资源时,将使

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

  • 当example1.com需要访问example2.com端的资源时,将使用查询字符串中的加密令牌执行response.redirect。e、 g.加密道肯
  • 此令牌在example2.com端读取,如果有效,则表单身份验证设置为“临时用户”。“临时用户”是专门作为代理创建的有限访问用户,例如.com用户 下面是在应用程序_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之前,这一切都很正常。i、 e.和。这一切都停止了。从example1.com到example2.com的Response.Redirect进入302循环,这意味着由于某种原因,身份验证cookie未被设置或接受。当我在Chrome浏览器开发者工具中查看网络活动时,我看到以下线索

    名称状态

    加密托克302

    加密托克302

    加密托克302

    最后,浏览器放弃并指示页面重定向次数过多


    有什么问题吗?

    谢谢艾丁的提示。对于同样面临类似问题的任何人来说,以下是解决方案

    • 在与Fiddler进行检查后,我发现身份验证cookies(.ASPXAUTH)是从服务器发送的,但浏览器没有在后续请求中发送它们
    • 此外,example2.com中的URL显示在IFrame内的example1.com中。经过一些搜索后,我发现对于iFrame,只有在Set Cookie响应头中指定了“SameSite=None”时,浏览器才会发送Cookie

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

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

    • 在与Fiddler进行检查后,我发现身份验证cookies(.ASPXAUTH)是从服务器发送的,但浏览器没有在后续请求中发送它们
    • 此外,example2.com中的URL显示在IFrame内的example1.com中。经过一些搜索后,我发现对于iFrame,只有在Set Cookie响应头中指定了“SameSite=None”时,浏览器才会发送Cookie

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

    您是否使用Fiddler检查了正在发生的事情,例如cookie是否已设置?(如果您不知道Fiddler是什么,它是一个反向代理,它记录从您的系统发出的原始http请求和响应、头文件、正文以及所有内容)。此外,您可能已经这样做了,但只需再次检查您的所有url引用是否也已更新为HTTPS,以及您正在设置的cookie的安全属性是否已设置为true(此设置不应产生任何影响,但仍要尝试)。您是否使用Fiddler检查了发生的情况,例如,正在设置cookies吗?(如果您不知道Fiddler是什么,它是一个反向代理,它记录从您的系统发出的原始http请求和响应、头文件、正文以及所有内容)。此外,您可能已经这样做了,但只需再次检查您的所有url引用是否也已更新为HTTPS,以及您正在设置的cookie是否已将Secure属性设置为true(此设置不应产生任何影响,但请尝试)。