如何在没有开发环境的数据库的情况下实现SignInManager?

时间:2016-06-15 00:55:12

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

我正在尝试使用ASP.NET Identity在Web应用程序上启用授权和身份验证。我正在尝试使用SignInManager,但是当它调用PasswordSignInAsync时,它正在寻找一个数据库。有没有办法将它用于内存数据(例如用户集合)用于测试目的?

我正在使用默认的ApplicationUser类(Model)。

public class ApplicationUser : IdentityUser
{

    public Guid UserId { get; set; }
    public string Name { get; set; }
    public string Password { get; set; }
 }

这是控制器上的Login ActionResult方法。

[HttpPost]
public async Task<ActionResult> Login(LoginViewModel viewModel, string returnUrl)
{
    if (ModelState.IsValid)
    {
        var signInResult = await _signInManager.PasswordSignInAsync(viewModel.Email, viewModel.Password,
                                                                   true, false);
        if (signInResult.Succeeded)
            ......
    }
}

_signInManager.PasswordSignInAsync调用查找数据库,我没有看到任何有用的重载来做任何不同的事情。

1 个答案:

答案 0 :(得分:2)

您可以使用SignInAsync方法代替并在内存中创建用户对象,以下代码可供我登录数据库中不存在的用户。

var appUser = new ApplicationUser
{
    Id = 1,
    UserName = viewModel.UserName,
    Email = viewModel.UserName,
    SecurityStamp = Guid.NewGuid().ToString()
};
try
{
    var userPrincipal = await _signInManager.CreateUserPrincipalAsync(appUser);
    foreach(var claim in userPrincipal.Claims)
    {
        appUser.Claims.Add(new ApplicationUserClaim { UserId = appUser.Id, ClaimType = claim.Type, ClaimValue = claim.Value });
    }
    await _signInManager.SignInAsync(appUser, viewModel.RememberMe);
    return RedirectToLocal(returnUrl);
}
catch (Exception ex)
{
    // Log Exception
    ModelState.AddModelError(string.Empty, "Invalid login");
    return View();
}

另一种选择是自定义身份存储提供程序以使用无持久性存储(例如EF7 InMemoryDatabase)。

请参阅以下链接以获取更多信息

identity-custom-storage-providers

相关问题