2012-10-04 22 views
0

我有一個應用程序,其中一個用戶名可以屬於許多公司。因此,爲了區分它們,我需要使用用戶名和密碼作爲唯一對來登錄。如何在asp.net中使用3個參數登錄mvc

我正在使用ASP.NET MVC,我很想知道登錄發生的位置。 其實我可以看到它驗證用戶的位置,但我找不到它檢索用戶的位置。

那麼,其中username = XX和密碼= XX發生

選擇用戶?

不同地問:我沒有找到用戶設置?我看到User.Identity.Name它的代碼,但我沒有看到: 用戶=選擇....

感謝 約翰

+0

如果兩個用戶(約翰)從兩個不同的公司(A和B)都希望使用的密碼(「thisisabadpassword 「)? – hometoast

+0

好問題:目前我不會允許這個。 – user96547

+0

你在VS2010中使用MVC模板嗎?如果 –

回答

3

約翰,你正在使用MVC。除了LINQ語法外,您不會在代碼中看到任何查詢。我猜你正在嘗試做的是用戶表和公司表之間的多對多關係。 (一個用戶有多個公司,一個公司有多個用戶) 非常多的數據庫明智這意味着你需要一個額外的表,公司和用戶的兩個首要鍵。

回到你的問題。 ASP.net MVC有自己的會員供應商。你可以選擇使用默認的表格或覆蓋它,並創建你自己的定製會員供應商(有能力使用你自己的用戶表)

默認的一個應該包含大部分基本屬性。 (密碼重置,密碼鹽,電子郵件..) http://www.asp.net/web-forms/tutorials/security/membership/creating-the-membership-schema-in-sql-server-cs 跳到步驟:安裝應用程序服務生成表

但是猜你已經有一個數據庫,你自己的用戶表。你應該覆蓋自定義成員資格類。

只要這意味着你做的是從抽象類「的MembershipProvider」

public class MyMembershipProvider : MembershipProvider 
{ 

} 

繼承之後,你必須讓ASP知道你將覆蓋與你默認的MembershipProvider在網絡的新類的.config

<membership defaultProvider="MyMembershipProvider"> 
     <providers> 
     <clear /> 
     <add name="MyMembershipProvider" 
      applicationName="MyApp" 
      Description="My Membership Provider" 
      passwordFormat="Clear" 
      connectionStringName="MyMembershipConnection" 
      type="MyApp.MyMembershipProvider" /> 
     </providers> 
    </membership> 

的成員資格提供一些方法需要你返回或使用的對象的MembershipUser。如何實現這一切就在這裏: http://msdn.microsoft.com/en-us/library/system.web.security.membershipuser.aspx 這不是一個必要的步驟,但其建議。

祝你好運:)約翰如果 在孤單的解釋混淆,不要猶豫問

+0

謝謝安東尼。你對模型部分是正確的。所以我創建了一個自定義MemberShipser。現在我看不到我的用戶在哪裏?我已經重載了VerifyMethod,但我沒有看到在哪種方法中我將創建用戶?如果它是GetUser,它將在哪裏被調用? – user96547

+0

除非你已經實現了自定義membershipprovider(一個實現接口MembershipProvider方法的類),否則你不能對membershipuser做任何事情。實現您的Web應用程序所需的方法。 (我建議寫一個單獨的庫用於用戶表,並在成員類中使用它。我建議建立一個爲的MembershipUser因爲Membership.getUser()返回該類的對象的原因。總之,這意味着你從讀取當前用戶數據庫與存儲庫,並使用屬性來填充membershipuser對象 –

1

答案很簡單:

你的代碼描述發生在賬戶控制器的登錄操作幕後:

MembershipService.ValidateUser(model.UserName, model.Password) 

這對於一個有效的用戶返回true。

FormsService.SignIn(model.UserName, model.RememberMe) 

(你可以看到Models文件夾下,都在AccountModels定義的那些功能的文件)

如果你也想:用戶然後在下一行代碼「登錄」在驗證用戶的同時檢查公司ID,然後您需要編寫自己的驗證方法來替換ValidateUser。 THS將取決於你正在使用的爲您的商店(SQL?)

但是,作爲一個更廣泛的觀點,最佳做法,你不應該允許不同的用戶相同的用戶名。這只是一個壞主意,會導致麻煩。

UPDATE:

如果我是建議如何做到這一點,我建議你的用戶ASP.NET成員資格的用戶配置方面。它旨在捕獲和存儲其他用戶變量(例如公司),同時仍然使用他們爲您編寫的精心構建和安全的成員資格。閱讀它,但下面是我目前正在開發的應用程序中的CreateUser函數。請注意我如何使用配置文件來存儲名和姓,以及用戶需要重置密碼的標誌。

同樣,這將搶先擁有多個用戶使用相同用戶名的能力,但我真的認爲你應該避免這種情況。

[HttpPost] 
public ActionResult CreateUser(string username, string email, string first, string last, string role) 
{    
    string password; 
    MembershipUser user; 

    //Generate a random password 
    password = Auth.CreateRandomPassword(6); 

    try 
    { 
     //Create the user 
     user = Membership.CreateUser(username, password, email); 

     //Add the user to the chosen role 
     Roles.AddUserToRole(username, role); 

     //Create the user profile 
     UserProfile profile = UserProfile.GetUserProfile(username); 

     profile.FirstName = first; 
     profile.LastName = last; 
     profile.ForcePasswordReset = true; 

     profile.Save(); 

     EmailNewUser(username, email, password); 

    } 
    catch (Exception ex) 
    {     
     HttpContext.Response.StatusCode = 500; 
     HttpContext.Response.StatusDescription = ex.Message; 
     HttpContext.Response.Clear(); 
    } 

    return PartialView("UserTable", Auth.Users()); 

} 
+0

FormsService.SignIn不會出現在我的應用程序.. – user96547

+0

根據Visual Studio和MVC的版本,您正在使用,也可能是不同的封裝或根本沒有。被封裝的功能是「FormsAuthentication.SetAuthCookie()」,它是在system.web.security庫。 –

+0

你是對的,它是SetAuthCookie。這個名字是如此糟糕......但後來我在哪裏/從我自己的DB – user96547

相關問題