带有电子邮件地址的Asp.Net身份验证

时间:2011-03-06 02:57:06

标签: c# asp.net webforms

我使用的是电子邮件地址作为登录的“用户名”。当用户登录时,创建的User对象的电子邮件地址名称不正确。实际名称是DB中的另一个字段。如何登录和验证电子邮件地址,然后在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>

对不起我的问题太模糊了。我很失落,我不知道如何写一个好问题。

4 个答案:

答案 0 :(得分:2)

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

修改

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

快速简便的解决方案

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

替代解决方案

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

希望有所帮助。

答案 1 :(得分:1)

我会完成您到目前为止所做的工作,然后将用户名,地址等存储在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;

答案 2 :(得分:1)

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

基本上,你只需做类似

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

第一行是调用db来获取用户名的示例。第二行根据此信息创建主体和标识,然后将其分配给HttpContext的用户属性

答案 3 :(得分:0)

Dim username As String = Membership.GetUserNameByEmail(txtUsername.Text)
If (Membership.ValidateUser(username, txtPassword.Text)) Then

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

你觉得怎么样?