2

我正在编写一个 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),但我在网上找不到任何关于如何构建解决方案的好的教程。任何帮助将不胜感激。谢谢。

4

1 回答 1

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 配置文件提供程序,您将拥有每个用户的配置文件信息,而与用于对用户进行身份验证的成员资格提供程序无关。

于 2008-09-15T21:54:39.777 回答