我正在尝试使用ASP.NET标识在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调用查找数据库,我没有看到任何有用的重载来做任何不同的事情。
您可以改为使用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内存数据库)。
有关更多信息,请参阅以下链接