我们正在开发一个MVC5系统,它将有一个网站和一个网络应用程序接口。身份验证方法将是使用个人帐户/本地登录的asp.net身份。
网站需要标准用户名/密码登录。
Web API将通过手持设备(具有集成条形码扫描仪的Windows CE设备)使用,并且用户故事定义PIN (4-6位数字)比该设备上的复杂密码更可取。
同样的userId将有一个复杂的密码来登录网站,理想情况下还有一个个人识别码来登录手持设备。
我已经创建了一个相对简单的解决方案,当用户注册时创建2个帐户。
用户名为"MART0001“的普通用户帐户,仅在网站上接受。
用户名"MART0001_^“末尾附加了字符的辅助帐户。辅助帐户可以具有PIN密码,并且仅在从web API调用时才会被接受。
这并不理想,因为我必须放宽ApplicationUserManager PasswordValidator规则,以允许接受个人识别码,并管理我自己的复杂字符密码验证规则,以便输入主要帐户密码。
我还必须通过允许重置其中一个/两个帐户来管理忘记密码/PIN的用户。
有没有人能想到一个更优雅的解决方案?
发布于 2016-09-26 21:39:43
一定。一个用户拥有两个用户帐户是不可行的。保持帐户同步将是一场噩梦,如果你能管理它的话。将pin添加为单独的列,并在提供pin时执行自定义身份验证。基本上,您只需使用类似于UserManager.FindByEmailAsync而不是UserManager.PasswordSignInAsync之类的命令来选择用户。然后,手动检查引脚是否匹配。如果是,请使用SignInManager.SignInAsync登录该用户。如果不是,则返回典型的登录失败错误消息。
当然,您应该对数据库中的pin进行散列,并将其与用户输入的pin的散列进行比较,这与处理密码的方式相同。您应该能够使用UserManager.PasswordHasher.HashPassword和UserManager.PasswordHasher.VerifyHashedPassword分别对存储在数据库中的pin进行散列处理,并验证用户输入的pin。
当pin设置为时为
user.Pin = UserManager.PasswordHasher.HashPassword(pin);使用pin登录时的
var user = UserManager.FindByNameAsync(username);
if (user != null && UserManager.PasswordHasher.VerifyHashedPassword(user.Pin, pin))
{
await SignInManager.SigInAsync(user, isPersistent, rememberBrowser);
// redirect
}
// return errorhttps://stackoverflow.com/questions/39703364
复制相似问题