2011-03-06 194 views
1

我正在使用電子郵件地址作爲登錄的「用戶名」。當用戶登錄創建的用戶對象具有電子郵件地址作爲不正確的名稱時。實際名稱是數據庫中的另一個字段。如何根據電子郵件地址登錄並進行身份驗證,然後在用戶對象中加載正確的名稱?使用電子郵件地址進行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

回答

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; 
+0

這就是我決定去的方式。就我的目的而言,這是最容易實現的,儘管它比預期的花費更多的工作。謝謝吉米! – ChrisOPeterson 2011-03-11 07:00:24

2

我相信你問的是:我可以更改屬性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

1

你肯定可以考慮使用配置文件提供像吉米建議的那樣。或者,您可以實施IPrincipal並在您的PostAuthenticateRequest事件中設置HttpContext.User屬性。

基本上,你只是像做

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

第一行是您的數據庫來獲取用戶名打電話的例子。第二行創建從該信息的主要和同一性,然後將其分配給的HttpContext

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

User屬性下面是一些Vb的代碼。似乎保留在成員資格提供者列。基本上,你允許用戶輸入他們唯一的電子郵件地址,並使用電子郵件地址獲取他們的用戶名。然後使用驗證方法通過用戶名和密碼對用戶進行身份驗證。

你認爲什麼人。

相關問題