2015-05-12 128 views
0

我正在使用MVC 5和ASP身份來創建一個新應用程序。我需要修改登錄過程,因此只顯示有關用戶社區的信息。我正在考慮在其中創建另一個帶有社區ID和用戶ID的表,類似於AspUserRoles表。我如何將其與登錄過程綁定?對不起,我是新來的MVC從Web窗體:(未來修改登錄MVC 5 Asp身份

感謝

+0

道歉,如果我沒有理解錯的,但你讓你的應用程序的多租戶後?那麼每個用戶都屬於一個社區? – heymega

+0

是的,這是正確的。 – user2719830

回答

0

似乎是一個有效的方法,使你的東西,如結束:!

public class Community 
{ 
    ... 
    public virtual ICollection<ApplicationUser> Members { get; set; } 
} 

public class ApplicationUser : IdentityUser 
{ 
    ... 
    public virtual ICollection<Community> Communities { get; set; } 
} 

實體框架將自動生成然後,在你的登錄中,以某種方式提供社區ID,這可以來自特定的URL,隱藏的輸入,選擇框等等,這取決於你自己,然後,你只需要修改默認情況下,在生成的項目模板中,通過以下行處理登錄:

var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 

你可以看到代碼爲PasswordSignInAsynchere。但我會在這裏發佈供後人得好:

public virtual async Task<SignInResult> PasswordSignInAsync(string userName, string password, 
    bool isPersistent, bool shouldLockout) 
{ 
    var user = await UserManager.FindByNameAsync(userName); 
    if (user == null) 
    { 
     return SignInResult.Failed; 
    } 

    return await PasswordSignInAsync(user, password, isPersistent, shouldLockout); 
} 

所以,只要在IdentiyConfig.cs添加自己的這個版本ApplicationSignInManager

public virtual async Task<SignInResult> PasswordSignInAsync(int communityId, string userName, string password, 
    bool isPersistent, bool shouldLockout) 
{ 
    var user = await UserManager.FindByNameAsync(userName); 

    if (user == null || !user.Communities.Any(m => m.Id == communityId)) 
    { 
     return SignInResult.Failed; 
    } 

    return await PasswordSignInAsync(user, password, isPersistent, shouldLockout); 
} 

注意額外的條件。然後,你只需要修改的Login動作原始呼叫在communityId經過:

var result = await SignInManager.PasswordSignInAsync(communityId, model.Email, model.Password, model.RememberMe, shouldLockout: false); 
+0

感謝您的詳細解釋。我會給它一個鏡頭。 – user2719830

+0

我是否應該創建另一個持有CommunityID和UserID's的表,或者只需將CommunityId添加到用戶表並在創建新用戶時將其傳入? – user2719830

+0

同樣,一旦將兩個集合屬性添加到關係的每一側,實體框架將自動爲M2M關係創建一個連接表。 –