【问题标题】:Asp.Net authentication with email address使用电子邮件地址进行 Asp.Net 身份验证
【发布时间】:2011-03-06 02:57:05
【问题描述】:

我使用电子邮件地址作为登录的“用户名”。当用户登录时,创建的用户对象的名称为电子邮件地址,这是不正确的。实际名称是数据库中的另一个字段。如何登录并针对电子邮件地址进行身份验证,然后在 User 对象中加载正确的名称?

我正在使用带有自定义 MembershipProvider 和 RoleProvider 的表单身份验证。

编辑下方以澄清

我有一个自定义 MembershipProvider,它通过电子邮件地址和密码验证用户。它由基本登录控件调用并在 web.config 中注册。

<asp:Login ID="AdminLogin" runat="server" MembershipProvider="AdminMembershipProvider">
</asp:Login>

Web.Config:

<authentication mode="Forms">
        <forms loginUrl="Default.aspx" />
    </authentication>
    <membership defaultProvider="AdminMembershipProvider">
      <providers>
        <clear />
        <add name="AdminMembershipProvider"
             type="AdminMembershipProvider"
             connectionStringName="EvalSysConnectionString"
             />

      </providers>
    </membership>

只有这样我的用户才能正确登录。但是,它会返回电子邮件地址的 Context.User.Identity.Name。我在数据库中存储了名字和姓氏,并希望这是名称。

我阅读了各种帖子,这些帖子似乎表明我必须创建一个 Global.asax 文件并覆盖 PostAutheticateRequest 方法来执行此操作。但是我不知道如何继续这个策略。

<%@ Application Language="C#" %>

<script runat="server">

    protected void Application_PostAuthenticateRequest()
    {
        string test = HttpContext.Current.User.ToString();
    }

</script>

对不起,我的问题太含糊了。我很迷茫,以至于我不知道如何写一个好问题。

【问题讨论】:

  • 问题没什么意义......你试过什么?
  • 同意米奇。您需要发布您尝试过的内容、如何调用 MembershipProvider 等。

标签: c# asp.net webforms


【解决方案1】:

我相信您要问的是:我可以更改属性 Context.User.Identity.Name 以显示用户名以外的其他内容吗?

编辑

无法使用属性Context.User.Identity.Name 的实现,因为它是只读的并且设置为用户名,无法更改。

快速简便的解决方案

您可以编写一个方法来调用数据库中的存储过程(或代码中的查询),以根据Context.User.Identity.Name 中的值进行查找并返回First 和Last。您可以将结果存储在 Session 变量中或使用 Profile 对象(如下所述)。

替代解决方案

您可以编写自己的 IIdentity 实现。这是我从未做过的事情,所以我没有任何 sn-ps 可以贡献。然而这个link 应该给你一个开始的地方。我会小心使用此解决方案,因为您会失去识别用户的独特方式,除非您在 IIdentity 的实现中添加额外的属性,并确保在引用时将 Context.User.Identity 转换为您自己的实现。

希望对您有所帮助。

【讨论】:

  • 这不正是我要问的。用户名和密码身份验证针对电子邮件地址和密码进行。然后,我存储了用户的名字和姓氏,我希望将其作为存储在 Context.User.Identity.Name 中的名称。如果这有意义....
  • 可以,但是 Context.User.Identity.Name 是只读的。我建议根据需要通过进行数据库查找来提取信息,并将其存储在会话变量或 Profile 对象中,如下所述。
  • 我现在正在努力,这似乎是最好的方向。为什么 asp.net 登录方案有这么多不同的部分?它把我搞糊涂了!
  • 对我来说也是一次学习经历,PITA,哈哈。祝你好运。这样看起来更干净,否则您可以想象如果您的用户具有相同的名字和姓氏,这可能会更加痛苦。当您想要进行更新时,您将没有参考要更新的实际用户。
【解决方案2】:

我会完全按照您目前所做的操作,然后将用户名、地址等存储在 Profile 对象中。

这就像添加一些配置(web.config)一样简单:

<profile>
  <providers>
    <clear />
    <add name="SqlProvider"
      type="System.Web.Profile.SqlProfileProvider"
      connectionStringName="SqlServices"
      applicationName="SampleApplication"
      description="SqlProfileProvider for SampleApplication" />
  </providers>
  <properties>
    <add name="Name" />
  </properties>
</profile>

然后像这样检索/设置它:

txtName.Text = Profile.Name;
Profile.Name = txtName.Text;

【讨论】:

  • 这是我决定走的路。就我的目的而言,它是最容易实现的,尽管它花费的工作比预期的要多。谢谢吉米!
【解决方案3】:

您绝对可以考虑使用 Jimmy 建议的个人资料提供程序。或者,您可以实现 IPrincipal 并在 PostAuthenticateRequest 事件中设置 HttpContext.User 属性。

基本上,你只需做类似的事情

        var userName = Database.GetUserName(httpContext);
        httpContext.User = new GenericPrincipal(new GenericIdentity(userName, "FORMS"), new[] {"UserRole1"});

第一行是调用您的数据库以获取用户名的示例。第二行根据该信息创建主体和身份,然后将其分配给 HttpContext 的 User 属性

【讨论】:

    【解决方案4】:
    Dim username As String = Membership.GetUserNameByEmail(txtUsername.Text)
    If (Membership.ValidateUser(username, txtPassword.Text)) Then
    

    这是一些 Vb 代码。这似乎保留了 Membership Provider 中的列。基本上,您允许用户输入他们唯一的电子邮件地址,并使用电子邮件地址获取他们的用户名。然后使用验证方法通过用户名和密码对用户进行身份验证。

    你们怎么看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      相关资源
      最近更新 更多