2015-05-18 6 views
1

Я пытаюсь реализовать имена пользователей на основе адресов электронной почты в AspNet.Identity для MVC5. Мои приложения работают, пока в системе зарегистрировано электронное имя/имя пользователя.UserManager.FindByEmail() return Null

Я только что обнаружил, что если пользователь не существует, и пытается войти в исключение брошено на линии 72.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:
Line 71: //Add this to check if the email was confirmed.
Line 72: var userid = UserManager.FindByEmail(model.Email).Id;

Вот мой код.

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     //Add this to check if the email was confirmed. 
     var userid = UserManager.FindByEmail(model.Email).Id; 
     // **Line 72. 'userid' is empty.** 

     // Here is my attempt but doesn't do anything. 
     if (string.IsNullOrEmpty(userid)) { 
      ModelState.AddModelError("","You are not registered!"); 
     } 

     if (!UserManager.IsEmailConfirmed(userid)) 
     { 
      ModelState.AddModelError("", "E-mail address has not been confirmed."); 
      return View(model); 
     } 
    } 
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false); 
    switch (result) 
    { 
     case SignInStatus.Success: 
      return RedirectToLocal(returnUrl); 
     case SignInStatus.LockedOut: 
      return View("Lockout"); 
     case SignInStatus.RequiresVerification: 
      return RedirectToAction("SendCode", new { ReturnUrl = returnUrl }); 
     case SignInStatus.Failure: 
     default: 
      ModelState.AddModelError("", "Invalid login attempt."); 
      return View(model); 
    } 
} 

Спасибо!

+0

Та же проблема. На самом деле все методы Find * возвращают null по какой-то причине. Целевые пользователи были засеяны при создании приложения. – Ryan

+0

Решено. Просто была неправильная конфигурация промежуточного ПО Auth. – Ryan

ответ

0

Я добавил код ниже, и он работает, но я до сих пор не понимаю, как работает метод FindByNameAsyn(), а не FindByName()? Также Есть ли лучший способ сделать это? Спасибо!

// Код, который работает.

var user = await UserManager.FindByNameAsync(model.Email); 
       if (user == null) 
       { 
        ModelState.AddModelError("", "Invalid login attempt."); 
        return View(model); 
       } 
0

Я попытался ниже код и работал для меня:

// 
    // POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 

     string userName = ""; // to be used as arg to PasswordSignInAsync 

     // you'd better declare the appropriate Type. 
     // using "var" doesn't work here - I don't know why... 
     ApplicationUser user = await UserManager.FindByEmailAsync(model.UserName); 

     if (user != null) 
     { 
      // found an existing user having the given Email 
      // so let's get it's UserName to test SignIn 
      userName = user.UserName; 
      // just for debugging - check your AspNetUser table 
      // ModelState.AddModelError("", userName + " ID = " + user.Id.ToString()); 
     } 
     else 
     { 
      // Hum... no email found - perhaps the user is really trying the UserName 
      // Perhaps Email != UserName 
      // It's interesting to give the user the option to use Email or UserName 
      // to get authenticated. 
      // Let's play, then! 
      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(userName, model.Password, 
           model.RememberMe, shouldLockout: true); 

     // from here on, it's the scaffolded code... 

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

Надеется, что это полезно, даже после того, как все это время.

Пожалуйста сообщите, если проблема решена. С уважением.