使用电子邮件地址进行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>
对不起,我的问题太模糊了。我很迷茫,我不知道如何写出一个好问题。
我会尽力做到目前为止所做的,然后将用户姓名,地址等存储在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;
这就是我决定去的方式。就我的目的而言,这是最容易实现的,尽管它比预期的花费更多的工作。谢谢吉米! – 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
投射到你自己的实现上,否则你将失去识别用户的独特方式。
希望有所帮助。
这不完全是我问的。用户名和密码验证是针对电子邮件地址和密码进行的。然后,我将存储的用户的名字和姓氏保存为Context.User.Identity.Name中存储的名称。如果这是有道理的.... – ChrisOPeterson 2011-03-11 03:15:53
它确实,但是Context.User.Identity.Name是只读的。我建议根据需要通过执行数据库查找来提取信息,并存储在会话变量或Profile对象中,如下所述。 – rgmills 2011-03-11 03:23:32
我现在正在处理这个问题,它似乎是最好的方向。为什么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的代码。似乎保留在成员资格提供者列。基本上,你允许用户输入他们唯一的电子邮件地址,并使用电子邮件地址获取他们的用户名。然后使用验证方法通过用户名和密码对用户进行身份验证。
你认为什么人。
问题没有意义....你有什么尝试? – 2011-03-06 03:00:32
同意米奇。你需要发布你已经尝试过的东西,你的MembershipProvider是如何调用的等 – mfanto 2011-03-06 03:08:37