我使用的是电子邮件地址作为登录的“用户名”。当用户登录时,创建的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>
对不起我的问题太模糊了。我很失落,我不知道如何写一个好问题。
答案 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代码。这似乎保留了成员资格提供程序中的列。基本上,您允许用户输入其唯一的电子邮件地址,并使用电子邮件地址获取其用户名。然后使用验证方法通过用户名和密码对用户进行身份验证。
你觉得怎么样?