使用ASPNet.Identity

时间:2018-11-28 21:37:39

标签: c# asp.net asp.net-mvc asp.net-identity

因此,我有多个基于一个代码库(asp.net标准MVC)运行的网站。我正在使用内置的ASPNet.Identity方法供用户注册/登录(使用ApplicationSignInManager,ApplicationUserManager)。

当前,所有网站都使用一个数据库来存储用户信息。这引起了两个问题:

  1. 当用户A在网站A上注册时,他们现在可以使用相同的详细信息登录到网站B。据他们所知,他们没有在网站B上注册。不好!

  2. 如果我限制用户A仅访问网站A,然后该用户尝试在网站B上注册,则他们将收到“电子邮件地址已在使用中”错误。也不好!

我曾尝试将数据库分开,每个站点一个,以解决此问题,但是我不知道如何动态更改控制器中分配给ApplicationSignInManager和ApplicationUserManager的DBContext。

例如,当用户访问网站A时,我抓住了网站A的连接字符串并执行登录/注册操作。我需要域名来确定要加载的连接字符串,直到启动startup.cs代码并配置我的管理器实例之后,才能访问该字符串。

我认为其他人一定已经做到了。理想情况下,我需要动态更改已运行的DBContext AFTER Startup.cs。失败了,我需要一种很好的方法将多个相同的电子邮件地址存储在同一数据库中

谢谢

2 个答案:

答案 0 :(得分:0)

如果您在当前上下文所针对的网站的某个地方有一个标志,我想说最容易实现的是做两件事:

  • 用一个网站属性扩展IdentityUser,它只是一个简单的int WebsiteId或一个String。
  • 扩展AccountController以在需要的地方使用该属性,我认为您需要修改“注册”和所有“登录”功能以验证该帐户所针对的网站。

答案 1 :(得分:0)

我设法找到了解决方案。这不是最优雅的方法,但是它可以解决问题,直到我弄清楚如何动态更改在登录/注册期间使用的数据库上下文为止。

在IdentityConfig.cs中,我将“ RequireUniqueEmail”切换为false:

manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
    AllowOnlyAlphanumericUserNames = false,
    RequireUniqueEmail = false
};

然后,当用户注册时,我获取电子邮件地址,使其对他们注册的网站唯一,然后将其存储在UserName字段中(我不使用UserName)。他们登录时,在尝试登录之前,我会对输入的电子邮件地址进行相同的更改。

如果该用户在其他网站上注册,则即使电子邮件相同,用户名也将不同。虽然不完美,但是可以。

例如

string uniqueCode = "Website_Specific_String";
var user = new ApplicationUser { uniqueCode + model.Email, Email = model.Email};
var result = await UserManager.CreateAsync(user, model.Password);

和登录名

var user = await UserManager.FindByNameAsync(uniqueCode  + model.Email);

仍然有更好的想法。谢谢