【问题标题】:ASP.net Membership Provider - Switching Between Forms and Integrated AuthASP.net Membership Provider - 在表单和集成身份验证之间切换
【发布时间】:2010-09-09 01:33:50
【问题描述】:

我正在编写一个 Web 应用程序,我希望能够使用指向 SQL 数据库的表单身份验证,或者在 Web 应用程序的不同安装中使用集成身份验证。我可以通过任一提供商对用户进行身份验证,但我对如何构建我的数据库有疑问。

目前我正在做的是使用代码:

public static string UserID
{
  get
  {
     if (HttpContext.Current.User.Identity.AuthenticationType == "Forms")
     {
       //using database auth
       return Membership.GetUser().ProviderUserKey.ToString();
     }
     else
     {
       //using integrated auth
       return HttpContext.Current.Request.LogonUserIdentity.User.ToString();
     }
   }
 }

然后,我使用返回的密钥(取决于提供者,它是来自 aspnetdb 数据库的用户 ID,或 Windows SID)作为他们创建的项目的用户 ID,等等。用户 ID 字段与用户表中的用户表无关数据库虽然像您传统上所做的那样。

有没有更好的方法来解决这个问题?我曾想过创建一个用户表,其中包含两个字段 UserID(内部)和 ExternalID(存储 Windows SID 或来自 aspnetdb 的 ID),然后在整个应用程序中使用内部 UserID,但它与成员资格不一样c# 中的类。

似乎有很多应用程序允许您在集成身份验证和 FBA 之间切换(首先想到的是 Sharepoint 2007),但我在网络上找不到任何关于如何构建解决方案的好的教程。任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 你的实现有什么特别不干净的地方?需要更多关于您正在解决的问题的背景信息。

标签: asp.net authentication


【解决方案1】:

为什么不只使用两个不同的成员资格提供程序(Windows 和 Forms,而不是专门使用 LogonUserIdentify)?在您发布的代码示例中,您可以在 Membership 命名空间中为任何提供者使用相同的方法。您可以更改 Web.config 文件中的默认提供程序。我同意使用特定于“集成身份验证”的代码并不干净。这是一个例子:

<membership defaultProvider="1">
 <providers>
  <clear/>
  <add name="1" ... />
  <add name="2" ... />
 </providers>
</membership>

然后,更改 defaultProvider。处理 Membership 的 ASP.NET 控件(例如 Login 控件)有一个属性,可让您选择 Membership 提供程序,这意味着您可以通过编程方式选择一个。

用户 ID 仅在提供者的上下文中相关,因此使用“内部”用户名似乎没有必要 - 使用提供者名称和外部用户 ID(因为相同的用户 ID 可能存在于多个提供者中) 在您自己的数据存储中。

通常不需要创建您自己的用户 ID,因为 ASP.NET 提供程序会在幕后处理这些问题。例如,如果您使用 ASP.NET 配置文件提供程序,您将拥有每个用户的配置文件信息,而与用于对用户进行身份验证的成员资格提供程序无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多