gpt4 book ai didi

c# - 将 UserManager.FindAsync 与自定义 UserStore 结合使用

转载 作者:可可西里 更新时间:2023-11-01 07:58:35 25 4
gpt4 key购买 nike

我已经实现了自定义 UserStore , 它实现了 IUserStore<DatabaseLogin, int>IUserPasswordStore<DatabaseLogin, int> .

我的登录操作方法如下:

if (ModelState.IsValid)
{
if (Authentication.Login(user.Username, user.Password))
{
DatabaseLogin x = await UserManager.FindAsync(user.Username, user.Password);
DatabaseLogin Login = Authentication.FindByName(user.Username);
if (Login != null)
{
ClaimsIdentity ident = await UserManager.CreateIdentityAsync(Login,
DefaultAuthenticationTypes.ApplicationCookie);
AuthManager.SignOut();
AuthManager.SignIn(new AuthenticationProperties
{
IsPersistent = false
}, ident);
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "Invalid Login");
}
}
return View();

在我编写的自定义身份验证类中,Authentication ,我有一个工作正常的登录方法,也是 FindByName方法返回一个应用程序用户。但是如果我尝试 SignIn使用该登录名,用户未被识别为经过身份验证并且 HttpContext.User.Identity总是空的,所以我想我必须尝试 UserManager.FindAsync .

此方法调用 FindByNameAsyncGetPasswordHashAsync , 它总是返回 null。

public Task<DatabaseLogin> FindByNameAsync(string userName)
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
return Task.FromResult<DatabaseLogin>(Authentication.FindByName(userName));
}

public Task<string> GetPasswordHashAsync(DatabaseLogin user)
{
if (user == null)
throw new ArgumentNullException("user");
return Task.FromResult<string>(user.Password);
}

还有 Authentication.FindByName

public static DatabaseLogin FindByName(string name)
{
string GetUserQuery = string.Format(
"USE db;SELECT principal_id AS id, name as userName, create_date AS CreateDate, modify_date AS modifyDate FROM sys.database_principals WHERE type='S' AND authentication_type = 1 AND name = '{0}'"
, name);
DatabaseLogin user;
using (var db = new EFDbContext())
{
user = db.Database.SqlQuery<DatabaseLogin>(GetUserQuery).FirstOrDefault();
}
user.Password = Convert.ToBase64String(Encoding.ASCII.GetBytes("pass"));
return user;
}

如您所见,我正在使用数据库用户,我不确定如何为他们检索散列密码。现在,我只是存储正确密码的 Base65!

我不知道我哪里出错了,欢迎任何指导。

最佳答案

简短回答:没有问题。用户在其他操作方法中进行了身份验证,但显然不是在当前操作方法中。

这是我遵循的过程,也许它会帮助您调试您的应用。

看完source code , FindAsync第一个电话 FindByNameAsync , 其次是 CheckPasswordAsync其中引用 VerifyPasswordAsync .所以应该没问题如果我可以覆盖 VerifyPasswordAsync .

我创建了一个自定义 password hasher实现 IPasswordHasher , 并将其注册在 create 中我的方法UserManager像这样:

manager.PasswordHasher = new DbPasswordHasher();

现在,我可以从 UserManager.FindAsync 获取我的用户,但事实证明,自 HttpContext.User.Identity 以来,从哪里获得用户并不重要。仍然是空的!我的错误是我没有注意到用户在当前操作中未通过身份验证,在其他操作方法中它按预期工作!

关于c# - 将 UserManager.FindAsync 与自定义 UserStore 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31635283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com