我有两个web应用程序,一个是简单的authenticationsite,它可以验证登录用户,然后将他重定向到另一个站点。在ASP.NET Web应用程序中隐藏查询字符串
因此,我必须将其userId(GUID)传递给第二个应用程序。目前这是通过URL完成的,但我想隐藏这个ID。
有没有人有一个想法如何正确地做到这一点?
[编辑]:我无法使用会话,因为ApplicationBoundaries(2个不同的服务器)
我有两个web应用程序,一个是简单的authenticationsite,它可以验证登录用户,然后将他重定向到另一个站点。在ASP.NET Web应用程序中隐藏查询字符串
因此,我必须将其userId(GUID)传递给第二个应用程序。目前这是通过URL完成的,但我想隐藏这个ID。
有没有人有一个想法如何正确地做到这一点?
[编辑]:我无法使用会话,因为ApplicationBoundaries(2个不同的服务器)
的通过会议,最好的方式传递的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。
使用会话变量或HTTP POST代替HTTP GET。
如果服务器有一个公用域名,可以使用cookie。
编辑:饼干将视觉隐藏ID,它仍然可以访问。与隐藏字段相同或使用POST而不是GET。因此,如果ID是有把握的,并且您希望避免通过未加密的网络将其发送到网络上,则需要采用不同的方法。
解决方案可能是使用服务器共享的密钥对auth服务器上的ID进行加密。另一种解决方案可能是在auth服务器上生成一个随机的GUID,然后让auth服务器直接通过其他服务器(通过SSL)通知与GUID对应的哪个ID。
而不是通过查询字符串来传递它,你应该创建一个隐藏的表单字段的值,然后发布到你的第二页,然后可以获取发布的值,它将从用户隐藏。
这听起来像一个棘手的情况。 然而,您可以使用几个选项,但这一切取决于您的应用程序的功能。
让我们调用WebApp1您的验证网站和WebApp2一旦验证通过您的远程站点。
WebApp2可以在幕后调用WebApp1吗? (服务)
在应用程序之间传递Guid的问题是它通过明文显示,并且考虑到它是用户ID,如果有人设法拦截此应用程序,他们将终身访问WebApp2。无论您是将查询字符串还是表单变量传递给它,它仍然很脆弱。
如果您无法使用WebApp2查询WebApp1,则应该考虑WebApp1创建一个到期的临时Guid。从长远来看,这会更安全一些,但由于明文仍然容易受到攻击。这两个Web应用程序还需要访问相同的数据存储。
最终,我认为AUentication Site应该是WebApp2可以使用的服务。 用户应该通过WebApp2登录,WebApp2将安全地调用WebApp1进行认证。 WebApp2可以管理它自己的会话。
如果您不能使用cookie,因为它是跨域的,请使用随机数对其进行加密。
在两台服务器之间设置共享密钥/密钥;将加密的GUID和nonce组合发送到第二台服务器。不加密,检查nonce是否已被使用(停止回复攻击),然后使用未加密的GUID。
如果你想要更加棘手的话,在app1上有一个web服务,它可以检查实际发布的随机数(此时你正朝着WSTrust和单点登录解决方案前进,重新尝试做)
即使使用cookie,由于它们很容易编辑/伪造,您应该进行某种形式的检查。
您有两个ASP.NET 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"));
}
那么,这究竟怎么办?
它消除了客户端的身份验证过程。
您当前的进程。
被替换为AppA和AppB之间的服务器端SOAP调用。现在,它是这样的:
去会话管理或使用HTTP帖子如上述帖子中所述。
问题是,实际的身份验证是在WeppApp1中使用的完整的其他服务中完成的:所以我无法真正使用temp。 GUID是因为他们正在接受另一个系统(这不在我的控制之下) – MADMap 2008-09-19 08:49:48