我想知道是否有人可以通过安全的方式提供有关实施全球登录的建议。我有一个管理页面,在输入您的用户名和密码后访问活动目录管理员组。
一旦重定向发生,在原始网络会话终止之前,如何安全地告诉原始网络应用该用户是否正常?
我正在考虑实施它的方式:
我最初的想法是将原始应用的会话ID传递给登录页面以及应用 名称。检查身份验证后,将该会话存储在数据库中。其他应用的母版页在会话ID匹配的页面加载时验证。在会话结束时,从DB中删除当前会话ID。
答案 0 :(得分:2)
在某些情况下,您无法准确依赖sessionID
。 SessionID
仅在(任意)页面发出会话变量请求后变为常量值,如果您未在Session_Start
中定义global.asax
。如果您将用户登录并且默认页面不访问会话,则最终将为后续请求提供不同的会话ID,直到发出会话请求为止。通常它始终是常量,因为session_start
中存在默认的空global.asax
事件。
但与您的模型类似,您可以生成GUID
(或确保您在登录/身份验证时访问会话)并将其存储在过期的用户表中。您的网站可以检查此密钥,如果当前有效,则自动为用户签名。
您也不能依赖session_end
事件,因为没有真正准确的检测方法(例如:用户关闭浏览器)。因此,您应该将此ID与过期时间一起存储,最好与会话超时相同。就像会话一样,你需要扩展它,比如滑动过期。这样,此ID将在一段时间不活动后过期。
此外,您可能会对此Claims-Based Single Sign-On for the Web感兴趣。
答案 1 :(得分:0)
您所描述的内容听起来好像使用Windows Identity Foundation和Active Directory Federation Services 2.0更好。我不知道您的所有要求的程度,但是查看这些要求会让您开箱即用可能很有价值。
答案 2 :(得分:0)
您可以使用Cookie。如果将应用程序的名称传递给登录页面,则可以将该应用程序名称设置为formsauthentication cookie的PATH属性。通过设置PATH属性,您可以有效地限制cookie对该路径中页面的可读性。因为它是一个常见的登录界面,所以这可能需要在一个公共页面基类中完成一些代码,这些类处理cookie信息的解析。
答案 3 :(得分:0)
您可以在.NET应用程序之间共享身份验证令牌,如果您愿意,也可以在.NET CLR之间共享。我想这会给你一个关于你正在寻找的标志。
在较高级别,您需要在应用程序之间共享计算机密钥。您可以使用此链接上的密钥生成器应用程序代码示例生成计算机密钥,然后在每个应用程序中引用相同的密钥,可以共享登录:
http://msdn.microsoft.com/en-us/library/ms998288.aspx
在跨域查看或跨机器/网络农场等方面有一些考虑因素,但如果所有应用程序都在同一个盒子上,那就不太难了。
事情的难点在于分享会话状态,我不相信可以在应用程序池中完成。 (我最后一次手动在新应用程序上重新创建会话对象:(但这是在1.1和2.0之间的应用程序)
编辑:去年我做了粗略的写作,并将其用作我网站上的演示文章的测试,如果你想要的东西分解得更多,可能值得一读(忽略未完成的网站!): http://www.dougmcdonald.co.uk/test/html5/v5/articles/2010/05/10/Sharing-forms-authentication-between-applications/