使用一个Asp.net Membership数据库来管理多个应用程序的单点登录

20

我在同一台IIS服务器上有两个asp.net应用程序,我希望使用相同的后端asp_security数据库和成员提供程序。我读过了相关资料,说只需在两个web config中引用相同的应用程序名称,就像我现在正在做的那样,但我一定做错了什么。

在每个应用程序的web.config文件中,我都有以下这个部分:

<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="membership"
              enablePasswordRetrieval="false"
              enablePasswordReset="true"
              requiresQuestionAndAnswer="false"
              applicationName="/"
              requiresUniqueEmail="false"
              minRequiredPasswordLength="5"
              minRequiredNonalphanumericCharacters="0"
              passwordFormat="Hashed"
              maxInvalidPasswordAttempts="5"
              passwordAttemptWindow="10"
              passwordStrengthRegularExpression=""
              />
  </providers>
</membership>

当我从应用程序 A 登录并浏览应用程序 B 时,应用程序 B 似乎不知道关于我或我的凭据的任何信息来自应用程序 A。 有人有什么想法,我做错了什么吗?

2个回答

21

仅为了让问题得到圆满解决,我将回答如何实现原始问题的目标。

我在一个IIS服务器上有两个asp.net应用程序。我的目标是让用户登录app1后他们的用户凭据在app2中也可用。配置asp.net成员资格提供程序只是我寻找的步骤之一。即使两个应用程序都使用相同的后端数据库和提供程序,当我访问app2时仍无法进行身份验证。我在寻找单点登录解决方案。

一旦你将以下内容放置在web.config文件的system.web部分中,使得两个应用程序都指向您的asp_membership数据库,就可以实现这一目标。

<authentication mode="Forms" />
<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider"
              type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="membership"
              applicationName="/"
              />
  </providers>
</membership>
<roleManager enabled="true" />

确保两个应用程序都设置了相同的applicationname属性。

我在使用IIS 6,因此我配置它自动生成一个机器密钥用于两个应用程序。由于这两个应用程序都位于同一台机器上,所以密钥是相同的,这是使SSO工作的关键部分。设置完IIS后,以下内容被添加到我的web.config文件中:

    <machineKey decryptionKey="AutoGenerate" validation="SHA1" validationKey="AutoGenerate" />

就是这样,完成这些步骤后,我可以登录到app1,然后浏览到app2并保留我的安全凭据。

感谢您给予正确指引。


1
非常感谢!你的问题和我的完全一样。大多数单点登录解决方案都很复杂,而且从来没有真正为我工作过,再次感谢! - stillsmallvoice

2
如果我理解正确,用户的身份验证凭据存储在每个应用程序的HTTP上下文中。因此,在两个应用程序之间切换不会自动对用户进行身份验证,因为当您切换到应用程序B时,将创建一个新的上下文。
我认为正确的方法可能是在切换到应用程序B之前使用当前用户的DefaultCredentials(或将UseDefaultCredentials属性设置为True)。
当你说切换时,你指的是什么,例如打开一个不同的浏览器窗口并访问app B,还是从app A请求app B的页面?

我认为你说得对,因为我现在可以看到我的数据库了,但是当我浏览到appB时没有已登录的用户。当你谈论DefaultCredentials时,你指的是哪个API?如果我要通过站点地图“切换”应用程序,你是否知道有什么方法可以避免在每个页面退出时都进行设置?感谢你的时间。 - jim
2
System.Net中的UseDefaultCredentials属性(http://msdn.microsoft.com/en-us/library/system.net.credentialcache.defaultcredentials.aspx)。在第二点上,我认为您需要在两个应用程序的web.config文件中设置机器密钥。有关更多信息,请参阅此MSDN文章http://msdn.microsoft.com/en-us/library/eb0zx8fc.aspx。 - Ahmad
1
дҪ й”ҷдәҶгҖӮAsp.netиЎЁеҚ•иә«д»ҪйӘҢиҜҒжҳҜеңЁеҠ еҜҶзҘЁиҜҒдёӯи·ҹиёӘзҡ„гҖӮиҝҷдёӘзҘЁиҜҒеҸҜд»ҘеӯҳеӮЁеңЁcookieжҲ–URLдёӯгҖӮжӯЈеҰӮд»–зҺ°еңЁжүҖзҹҘйҒ“зҡ„йӮЈж ·пјҢOPеҸӘйңҖиҰҒзЎ®дҝқеә”з”ЁзЁӢеәҸеҗҚз§°зӣёеҗҢпјҢ并且жҜҸдёӘеә”з”ЁзЁӢеәҸе…ұдә«дёҖдёӘе…¬е…ұжңәеҷЁеҜҶй’ҘгҖӮ - Sky Sanders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接