C# 允许用户使用电子邮件或用户名(AspNet.Identity)登录
我想知道这里是否有更有效的路线。使用C# 允许用户使用电子邮件或用户名(AspNet.Identity)登录,c#,asp.net-mvc,authentication,asp.net-identity,C#,Asp.net Mvc,Authentication,Asp.net Identity,我想知道这里是否有更有效的路线。使用AspNet.Identity我希望允许用户使用其用户名或电子邮件登录到同一文本框。我在AccountController登录操作结果中解决了这个问题。我在打电话之前进行了检查: var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: true); 支票: 我在这里关注两个方面:
AspNet.Identity
我希望允许用户使用其用户名或电子邮件登录到同一文本框。我在AccountController登录操作结果
中解决了这个问题。我在打电话之前进行了检查:
var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: true);
支票:
我在这里关注两个方面:
这是一种更有效、更实用的方法
这样做是否会带来任何新的安全风险或性能风险李>
我在下面附上整个操作结果
,以供参考
//
//POST:/帐户/登录
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务和
将有一个安全问题。如果您知道其他用户的电子邮件,则可以获取其用户名:
写他的电子邮件和错误的密码
然后,系统加载相应的用户名,执行密码验证,该验证失败,并返回带有被覆盖用户名的模型
我将声明新变量,而不是model.UserName重用。如果使用FirstOrDefault,您的查询将更加有效:
var userName = model.UserName;
using (var context = new ApplicationDbContext())
{
var user = context.Users.FirstOrDefault(p => p.Email == model.UserName);
if (user != null)
{
userName = user.UserName;
}
}
var result = await SignInManager.PasswordSignInAsync(userName, model.Password, model.RememberMe, shouldLockout: true);
您可以从不检查条目是否有@
@RedSerpent开始。我检查条目是否有@
的原因是因为我不想使用上下文.Users访问数据库。如果不需要,请执行任何LINQ查询。点击数据库是更好的解决方案吗?您在检查@
时遇到了什么问题?当我开始使用Identity 1.0时,我也遇到了同样的问题,我必须同样插入电子邮件和用户名字段。所有有效点,我肯定会介绍其中的一些更改。但是,这仍然使用与我已经使用的方法基本相同的方法,是否有一种方法可以通过AspNet.Identity
?@aaronmalen我不知道,但我认为您的解决方案已经足够好了。
//
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
//TODO: determine if there is a more efficient way to allow user to login either with Email || UserName
if (model.UserName.Contains("@"))
{
using (var context = new ApplicationDbContext())
{
model.UserName = (context.Users.Any(p => p.Email == model.UserName)) ?
context.Users.SingleOrDefault(p => p.Email == model.UserName).UserName :
model.UserName;
}
}
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true
var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: true);
switch (result)
{
case SignInStatus.Success:
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
var userName = model.UserName;
using (var context = new ApplicationDbContext())
{
var user = context.Users.FirstOrDefault(p => p.Email == model.UserName);
if (user != null)
{
userName = user.UserName;
}
}
var result = await SignInManager.PasswordSignInAsync(userName, model.Password, model.RememberMe, shouldLockout: true);