我正在使用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