【问题标题】:Using one Asp.net Membership database with multiple applications Single Sign On将一个 Asp.net Membership 数据库与多个应用程序一起使用
【发布时间】:2011-01-17 11:55:17
【问题描述】:

我在一台 IIS 服务器上有两个 asp.net 应用程序,我想使用相同的后端 asp_security 数据库和成员资格提供程序。我已经读到我所要做的就是在两个 Web 配置中引用相同的应用程序名称,就像我现在正在做的那样,但我一定做错了什么

在每个应用程序 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 的凭据一无所知。有人知道我做错了什么吗?

【问题讨论】:

    标签: asp.net asp.net-membership membership


    【解决方案1】:

    为了结束,我将回答我是如何实现我最初问题所要求的目标的。

    我在一台 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 并保留我的安全凭证。

    感谢您朝着正确的方向前进。

    【讨论】:

    • 非常感谢!你的问题和我的完全一样。大多数 SSO 解决方案都非常复杂,而且对我来说从来没有真正奏效过,再次感谢!
    【解决方案2】:

    如果我的理解正确,则用户身份验证凭据存储在每个应用程序的 HTTP 上下文中。因此在两个应用程序之间切换不会自动对用户进行身份验证,因为当您切换到应用程序 B 时会创建一个新的上下文。

    我认为正确的方法可能是在切换到应用 B 之前使用当前用户的 DefaultCredentials(或 UseDefaultCredentials 属性到 True)。

    当您说切换时,您是什么意思,例如。打开不同的浏览器窗口并访问应用 B 或从应用 A 向应用 B 请求页面?

    【讨论】:

    • 我认为您可能是对的,因为我现在可以看到我的数据库,但是当我浏览到 appB 时没有登录用户。当您谈论 DefaultCredentials 时,您指的是哪个 API? ...如果我要通过站点地图在应用程序之间“切换”,您是否看到退出时在每个页面上设置此设置的方法?感谢您的宝贵时间
    • System.Net (msdn.microsoft.com/en-us/library/…) 中的 UseDefaultCredentials 属性。关于第二点,我相信您需要在两个应用程序的 web.config 文件中设置机器密钥。有关更多信息,请参阅此 MSDN 文章msdn.microsoft.com/en-us/library/eb0zx8fc.aspx
    • 你错了。 Asp.net 表单身份验证在加密票证中进行跟踪。这张票可以存储在 cookie 或 url 中。正如他现在所知,OP 只需要确保应用程序名称相同并且每个应用程序共享一个公共机器密钥。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多