Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 允许用户使用电子邮件或用户名(AspNet.Identity)登录_C#_Asp.net Mvc_Authentication_Asp.net Identity - Fatal编程技术网

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);