我在一台IIS服务器上有两个asp.net应用程序,我想使用相同的后端asp_security数据库和成员资格提供程序。我已经读过,我所要做的就是在两个网络配置中引用相同的应用程序名称,就像我现在所做的那样,但我一定做错了什么
在每个应用程序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的凭据一无所知。任何人都有任何想法我正在做错的事情?
答案 0 :(得分:21)
为了关闭起见,我将回答我是如何实现我的原始问题所要求的目标。
我在一台IIS服务器上有两个asp.net应用程序。我的目标是,当用户登录app1时,可以在app2中使用他们的用户凭据。配置asp.net成员资格提供程序只是我所寻求的一步。即使两个应用程序都使用相同的后端数据库和提供程序,当我点击app2时仍然无法进行身份验证。我正在寻找的是单点登录解决方案。
将两个应用程序指向您的asp_membership数据库后,将以下内容放入Web配置的system.web部分
<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 :(得分:2)
如果我的理解正确地为我服务,则用户身份验证凭据存储在每个应用程序的HTTP上下文中。因此,在两个应用程序之间切换不会自动验证用户,因为当您切换到应用程序B时将创建新的上下文。
我认为正确的方法是在切换到应用B之前使用当前用户的DefaultCredentials
(或UseDefaultCredentials
属性True
)。
当你说切换你的意思时,例如。打开不同的浏览器窗口并访问应用B或从appA请求appB页面