使用电子邮件地址进行Asp.Net身份验证

问题描述:

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

我正在使用表单身份验证与自定义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> 

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

+0

问题没有意义....你有什么尝试? – 2011-03-06 03:00:32

+0

同意米奇。你需要发布你已经尝试过的东西,你的MembershipProvider是如何调用的等 – mfanto 2011-03-06 03:08:37

我会尽力做到目前为止所做的,然后将用户姓名,地址等存储在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; 
+0

这就是我决定去的方式。就我的目的而言,这是最容易实现的,尽管它比预期的花费更多的工作。谢谢吉米! – ChrisOPeterson 2011-03-11 07:00:24

我相信你问的是:我可以更改属性Context.User.Identity.Name以显示除用户名以外的东西吗?

编辑

它使用属性Context.User.Identity.Name的实施,因为它是只读的并且被设置为用户名,没有办法去改变它是不可能的。

一个快速简便的解决方案

你可以写(在你的代码或查询)在你的数据库做基础值的查找在Context.User.Identity.Name调用存储过程,并返回第一个和最后一个方法。您可以将结果存储在Session变量中,或使用Profile对象(如下所述)。

替代的解决方案

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

希望有所帮助。

+0

这不完全是我问的。用户名和密码验证是针对电子邮件地址和密码进行的。然后,我将存储的用户的名字和姓氏保存为Context.User.Identity.Name中存储的名称。如果这是有道理的.... – ChrisOPeterson 2011-03-11 03:15:53

+1

它确实,但是Context.User.Identity.Name是只读的。我建议根据需要通过执行数据库查找来提取信息,并存储在会话变量或Profile对象中,如下所述。 – rgmills 2011-03-11 03:23:32

+0

我现在正在处理这个问题,它似乎是最好的方向。为什么asp.net登录方案有很多不同的部分?它让我迷惑了! – ChrisOPeterson 2011-03-11 03:42:52

你肯定可以考虑使用配置文件提供像吉米建议的那样。或者,您可以实施IPrincipal并在您的PostAuthenticateRequest事件中设置HttpContext.User属性。

基本上,你只是像做

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

第一行是您的数据库来获取用户名打电话的例子。第二行创建从该信息的主要和同一性,然后将其分配给的HttpContext

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

User属性下面是一些Vb的代码。似乎保留在成员资格提供者列。基本上,你允许用户输入他们唯一的电子邮件地址,并使用电子邮件地址获取他们的用户名。然后使用验证方法通过用户名和密码对用户进行身份验证。

你认为什么人。