我正在使用MVC 5和ASP身份來創建一個新應用程序。我需要修改登錄過程,因此只顯示有關用戶社區的信息。我正在考慮在其中創建另一個帶有社區ID和用戶ID的表,類似於AspUserRoles表。我如何將其與登錄過程綁定?對不起,我是新來的MVC從Web窗體:(未來修改登錄MVC 5 Asp身份
感謝
我正在使用MVC 5和ASP身份來創建一個新應用程序。我需要修改登錄過程,因此只顯示有關用戶社區的信息。我正在考慮在其中創建另一個帶有社區ID和用戶ID的表,類似於AspUserRoles表。我如何將其與登錄過程綁定?對不起,我是新來的MVC從Web窗體:(未來修改登錄MVC 5 Asp身份
感謝
似乎是一個有效的方法,使你的東西,如結束:!
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);
你可以看到代碼爲PasswordSignInAsync
here。但我會在這裏發佈供後人得好:
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);
感謝您的詳細解釋。我會給它一個鏡頭。 – user2719830
我是否應該創建另一個持有CommunityID和UserID's的表,或者只需將CommunityId添加到用戶表並在創建新用戶時將其傳入? – user2719830
同樣,一旦將兩個集合屬性添加到關係的每一側,實體框架將自動爲M2M關係創建一個連接表。 –
道歉,如果我沒有理解錯的,但你讓你的應用程序的多租戶後?那麼每個用戶都屬於一個社區? – heymega
是的,這是正確的。 – user2719830