修改登录MVC 5 Asp身份

时间:2015-05-12 16:04:38

标签: asp.net-mvc

我正在使用MVC 5和Asp Identity来构建我正在构建的新应用程序。我需要修改登录过程,以便仅显示与用户社区相关的信息。我在考虑使用社区ID和用户ID创建另一个表,类似于AspUserRoles表。如何将其与登录过程联系起来?对不起,我是来自Web Forms的MVC新手:(

谢谢!

1 个答案:

答案 0 :(得分: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);

您可以看到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);
}

因此,只需将自己的版本添加到ApplicationSignInManager中的IdentiyConfig.cs

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);