2008-09-19 101 views
1

我有两个web应用程序,一个是简单的authenticationsite,它可以验证登录用户,然后将他重定向到另一个站点。在ASP.NET Web应用程序中隐藏查询字符串

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

有没有人有一个想法如何正确地做到这一点?

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

回答

0

的通过会议,最好的方式传递的GUID。

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

OR,因为它是2台不同的服务器上,由POST方法传递信息:

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

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

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

我会建议反对隐藏的领域主张,因为它完全抵消你正在尝试做的事情!您正试图隐藏URL中的GUID,但在HTML代码中发布相同的信息!这不是做到这一点的方法。

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

0

使用会话变量或HTTP POST代替HTTP GET。

0

如果服务器有一个公用域名,可以使用cookie。

编辑:饼干将视觉隐藏ID,它仍然可以访问。与隐藏字段相同或使用POST而不是GET。因此,如果ID是有把握的,并且您希望避免通过未加密的网络将其发送到网络上,则需要采用不同的方法。

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

0

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

2

这听起来像一个棘手的情况。 然而,您可以使用几个选项,但这一切取决于您的应用程序的功能。

让我们调用WebApp1您的验证网站和WebApp2一旦验证通过您的远程站点。

WebApp2可以在幕后调用WebApp1吗? (服务)

在应用程序之间传递Guid的问题是它通过明文显示,并且考虑到它是用户ID,如果有人设法拦截此应用程序,他们将终身访问WebApp2。无论您是将查询字符串还是表单变量传递给它,它仍然很脆弱。

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

最终,我认为AUentication Site应该是WebApp2可以使用的服务。 用户应该通过WebApp2登录,WebApp2将安全地调用WebApp1进行认证。 WebApp2可以管理它自己的会话。

+0

问题是,实际的身份验证是在WeppApp1中使用的完整的其他服务中完成的:所以我无法真正使用temp。 GUID是因为他们正在接受另一个系统(这不在我的控制之下) – MADMap 2008-09-19 08:49:48

2

如果您不能使用cookie,因为它是跨域的,请使用随机数对其进行加密。

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

如果你想要更加棘手的话,在app1上有一个web服务,它可以检查实际发布的随机数(此时你正朝着WSTrust和单点登录解决方案前进,重新尝试做)

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

2

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

这听起来像一份工作....

Web服务!

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

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

一个例子:

AuthenticateUserService.asmx那张身份验证的应用程序:

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")); 
} 

那么,这究竟怎么办?

它消除了客户端的身份验证过程。

  • APPB客户重定向回APPA如果证书匹配

    • 客户端进入凭据APPA
    • APPA重定向客户APPB:

      您当前的进程。

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

    • 客户端输入凭据在APPA
    • APPA问APPB只要是好的
    • APPA提供适当的内容给客户端。
  • 0

    去会话管理或使用HTTP帖子如上述帖子中所述。