【问题标题】:Hiding a queryString in an ASP.NET Webapplication在 ASP.NET Web 应用程序中隐藏查询字符串
【发布时间】:2010-09-11 03:41:44
【问题描述】:

我有两个 web 应用程序,一个是一个简单的身份验证站点,它可以对登录的用户进行身份验证并将他重定向然后到另一个站点。

因此,我必须将用户 ID (GUID) 传递给第二个应用程序。目前这是通过 URL 完成的,但我想隐藏这个 id。

有人知道如何正确执行此操作吗?

[编辑]:由于 ApplicationBoundaries(2 个不同的服务器),我无法使用会话

【问题讨论】:

    标签: c# asp.net web-services


    【解决方案1】:

    进行会话管理或使用上述帖子中所述的 HTTP Post。

    【讨论】:

      【解决方案2】:

      您有两个 ASP.NET Web 应用程序,其中一个应用程序只对用户进行身份验证?

      这听起来像是……的工作

      网络服务!

      在身份验证应用程序上创建一个新的 Web 服务(它们是 .asmx 扩​​展名),并添加一个接受用户和密码等的方法,并返回身份验证信息。

      然后在您的第二个应用程序上导入 WSDL,并像调用方法一样调用第一个应用程序。它将简化您的代码并解决您的问题。

      一个例子:

      AuthenticateUserService.asmx 继续 Authentication 应用程序:

      using System;
      using System.Web;
      using System.Web.Services;
      using System.Web.Services.Protocols;
      
      [WebService(Namespace = "http://tempuri.org/")]
      [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
      public class AuthenticateUserService : System.Web.Services.WebService 
      {   
          [WebMethod]
          public bool AuthenticateUser(string username, string passhash) 
          {
              // Fake authentication for the example
              return (username == "jon" && passhash == "SomeHashedValueOfFoobar");
          }
          
      }
      

      设置完成后,启动您的主应用程序,然后右键单击项目并单击“添加 Web 引用”。

      在身份验证应用上输入 asmx 的 url,Visual Studio 将发现它并创建一个代理类。

      完成后,我们可以像调用主应用程序中的本地方法一样调用该方法:

      protected void Page_Load(object sender, EventArgs e)
      {
          // Now we can easily authenticate user in our code
          AuthenticateUserService authenticationProxy = 
               new AuthenticateUserService();
          bool isUserAuthenticated = 
               authenticationProxy.AuthenticateUser("jon", SomeHashMethod("foobar"));
      }
      

      那么,这到底有什么作用呢?

      它将客户端从身份验证过程中消除。

      您当前的流程:

      • 客户端向 AppA 输入凭据
      • AppA 将客户端重定向到 AppB
      • 如果凭据匹配,AppB 会将客户端重定向回 AppA。

      替换为 AppA 和 AppB 之间的服务器端 SOAP 调用。现在是这样的:

      • 客户端在 AppA 中输入凭据
      • AppA 询问 AppB 是否良好
      • AppA 向客户端提供适当的内容。

      【讨论】:

        【解决方案3】:

        如果服务器有一个共同的域名,你可以使用 cookie。

        编辑:Cookies 只会在视觉上隐藏 ID,它仍然可以访问。与隐藏字段或使用 POST 而不是 GET 相同。因此,如果 ID 是机密的,并且您希望避免在未加密的情况下通过网络发送它,那么您需要一种不同的方法。

        一种解决方案可能是使用服务器共享的密钥对身份验证服务器上的 ID 进行加密。另一种解决方案是在身份验证服务器上生成一个随机 GUID,然后让身份验证服务器直接通知其他服务器(通过 SSL)该 GUID 对应的 ID。

        【讨论】:

          【解决方案4】:

          如果你不能使用 cookie,因为它是跨域的,那么用 nonce 加密它。

          在两台服务器之间设置共享密钥/密钥;将加密的 GUID 和 nonce 组合发送到第二个服务器。取消加密,检查 nonce 尚未被使用(停止回复攻击),然后使用未加密的 GUID。

          如果您想更加棘手,请在 app1 上安装一个 Web 服务,它可以检查实际发出的随机数(此时您正走向 WSTrust 和单点登录解决方案,它通常可以解决您的问题尝试做)

          即使使用 cookie,由于它们很容易被编辑/伪造,您应该进行某种形式的检查。

          【讨论】:

            【解决方案5】:

            这听起来很棘手。 但是,您可以使用多种选项,但这完全取决于您的应用程序的功能。

            我们将 WebApp1 称为您的身份验证站点,并将 WebApp2 称为您的目标站点(一旦通过身份验证)。

            WebApp2不能在后台调用WebApp1吗? (服务)

            在应用程序之间传递此 Guid 的问题在于它通过明文传输,并且考虑到它是一个用户 ID,如果有人设法拦截它,他们将可以终生访问 WebApp2。无论您是在查询字符串还是表单变量中传递它,它仍然容易受到攻击。

            如果您无法使用 WebApp2 查询 WebApp1,则应考虑 WebApp1 创建一个过期的临时 Guid。从长远来看,这会更安全,但由于它是明文,仍然容易受到攻击。这 2 个网络应用也需要访问相同的数据存储。

            最终,我认为身份验证站点应该是 WebApp2 可以使用的服务。 用户应通过 WebApp2 登录,它会安全地调用 WebApp1 进行身份验证。 然后 WebApp2 可以管理它自己的会话。

            【讨论】:

            • 问题是,实际的身份验证是在一个完整的其他服务中完成的,该服务在 WeppApp1 中使用:所以我不能真正使用 temp。 GUID 是因为它们引用了另一个系统(不在我的控制之下)
            【解决方案6】:

            通过会话传递 GUID,这是最好的方式。

            http://www.w3schools.com/ASP/asp_sessions.asp

            或者,因为它是2个不同的服务器,所以通过POST方法传递信息:

            http://www.w3schools.com/aspnet/aspnet_forms.asp

            另一种可能性是将会话状态存储在本地服务器上的数据库中,然后从其他服务器远程访问该数据库,以查看用户是否已成功登录并在会话时间限制内。

            考虑到这一点,您也可以远程执行整个身份验证。从远程服务器远程连接到本地数据库并从那里检查登录凭据...这样您就可以在远程服务器上存储会话和/或 cookie。

            我建议反对隐藏字段命题,因为它完全抵消了你想要做的事情!您试图在 URL 中隐藏 GUID,但在 HTML 代码中发布相同的信息!这不是这样做的方法。

            最好的选择是数据库选项,或者如果不可能,则使用 HTTP POST。

            【讨论】:

              【解决方案7】:

              而不是通过查询字符串传递它,您应该创建一个带有其值的隐藏表单字段,然后发布到您的第二页,然后可以获取发布的值,并且它将对用户隐藏。

              【讨论】:

                【解决方案8】:

                使用会话变量或 HTTP POST 而不是 HTTP GET。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-23
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-11-20
                  • 1970-01-01
                  相关资源
                  最近更新 更多