C#MVC ASP.NET身份-在运行时动态更改ApplicationDbContext连接字符串

问题描述 投票:0回答:2

我有3个数据库,其中一个GlobalDb用于根据登录详细信息管理和重定向用户正确的数据库。

其他2个数据库与GlobalDb不同,但彼此相同。让我们将这两个数据库称为Company1和Company2。

GlobalDb不需要身份框架,因此仅通过使用标准EntityFramework连接进行连接,其他2个都需要身份框架。

3个连接字符串保存在web.config中。

我可以正确查询所有数据库库,它们都返回数据。我遇到的主要问题是登录时,如何告诉SignInManager数据库使用哪个连接字符串?

IdentityModels.cs

public class CompanyDb : IdentityDbContext<ApplicationUser>
{
    public CompanyDb(string CompanyName)
        : base(CompanyName, throwIfV1Schema: false)
    {
    }

    public static CompanyDb Create(string CompanyName)
    {
        return new CompanyDb(CompanyName);
    }

    // Virtual class and table mappings go here.
}

AccountController登录

public async Task<ActionResult> CustomLogin(string Email, string Password, string returnUrl)
    {
        GlobalDb Global = new GlobalDb();

        // check what company the user belongs to based on email.
        var CompanyName = Global.Users.Where(u => u.Email == Email && u.Active == true).Select(u => u.Company).FirstOrDefault();

        // Connect to the desired database to get test data.
        CompanyDb Company = new CompanyDb(CompanyName);
        var DataTest = Company.Users.ToList();


        if (CompanyName != null)
        {
            var result = await SignInManager.PasswordSignInAsync(Email, Password, false, shouldLockout: false); // <-- How to connect to the correct DB?
            switch (result)
            {
                case SignInStatus.Success:
                    return RedirectToLocal(returnUrl);
                case SignInStatus.LockedOut:
                    return View("Lockout");
                case SignInStatus.RequiresVerification:
                    return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
                case SignInStatus.Failure:
                default:
                    ModelState.AddModelError("", "Invalid login attempt.");
                    return View("");
            }
        }

        return View("");
    }

我在以下文件和函数中不断得到空值

IdentityModel.cs

 // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }
}
asp.net-mvc entity-framework connection-string asp.net-identity
2个回答
1
投票

我想通了。

关于登录操作,如果仅将SignInManager封装在Context Using语句中,如下所示。

public async Task<ActionResult> CustomLogin(string Email, string Password, string returnUrl)
    {
        GlobalDb Global = new GlobalDb();

        // check what company the user belongs to based on email.
        var CompanyName = Global.Users.Where(u => u.Email == Email && u.Active == true).Select(u => u.Company).FirstOrDefault();

        if (CompanyName != null)
        {
            using (CompanyDb db = new CompanyDb(CompanyName))
            {
                var result = await SignInManager.PasswordSignInAsync(Email, Password, false, shouldLockout: false); // <-- How to connect to the correct DB?
                switch (result)
                {
                    case SignInStatus.Success:
                        return RedirectToLocal(returnUrl);
                    case SignInStatus.LockedOut:
                        return View("Lockout");
                    case SignInStatus.RequiresVerification:
                        return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
                    case SignInStatus.Failure:
                    default:
                        ModelState.AddModelError("", "Invalid login attempt.");
                        return View("");
                }
            }

        }

        return View("");
    }

0
投票

我尝试使用这种方式进行构建,但是发现发生了一些错误

对象引用未设置为对象的实例。说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

源错误:

第204行://这不将登录失败计入帐户锁定第205行://要启用密码错误触发帐户锁定,请更改为ShouldLockout:true第206行:var结果=等待SignInManager.PasswordSignInAsync(model.UserName,model.Password,model.RememberMe,shouldLockout:false);207行:开关(结果)第208行:{

好像signinmanager尚未实例化,请先告知...谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.