React to identity changes

This commit is contained in:
Hao Kung 2014-12-30 14:59:07 -08:00
parent a4d2d185e1
commit 14ec7960a1
4 changed files with 63 additions and 51 deletions

View File

@ -37,18 +37,19 @@ namespace MusicStore.Controllers
{ {
if (ModelState.IsValid == true) if (ModelState.IsValid == true)
{ {
var signInStatus = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false); var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);
switch (signInStatus) if (result.Succeeded)
{ {
case SignInStatus.Success: return RedirectToLocal(returnUrl);
return RedirectToLocal(returnUrl); }
case SignInStatus.LockedOut: if (result.IsLockedOut)
ModelState.AddModelError("", "User is locked out, try again later."); {
return View(model); ModelState.AddModelError("", "User is locked out, try again later.");
case SignInStatus.Failure: }
default: else
ModelState.AddModelError("", "Invalid username or password."); {
return View(model); ModelState.AddModelError("", "Invalid username or password.");
return View(model);
} }
} }
@ -138,7 +139,7 @@ namespace MusicStore.Controllers
{ {
foreach (var error in result.Errors) foreach (var error in result.Errors)
{ {
ModelState.AddModelError("", error); ModelState.AddModelError("", error.Description);
} }
} }

View File

@ -45,19 +45,23 @@ namespace MusicStore.Controllers
// This doesn't count login failures towards account lockout // This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, change to shouldLockout: true // To enable password failures to trigger account lockout, change to shouldLockout: true
var signInStatus = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false, cancellationToken: Context.RequestAborted); var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false, cancellationToken: Context.RequestAborted);
switch (signInStatus) if (result.Succeeded)
{ {
case SignInStatus.Success: return RedirectToLocal(returnUrl);
return RedirectToLocal(returnUrl); }
case SignInStatus.LockedOut: if (result.RequiresTwoFactor)
return View("Lockout"); {
case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe }); }
case SignInStatus.Failure: if (result.IsLockedOut)
default: {
ModelState.AddModelError("", "Invalid login attempt."); return View("Lockout");
return View(model); }
else
{
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
} }
} }
@ -99,17 +103,20 @@ namespace MusicStore.Controllers
// will be locked out for a specified amount of time. // will be locked out for a specified amount of time.
// You can configure the account lockout settings in IdentityConfig // You can configure the account lockout settings in IdentityConfig
var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, model.RememberMe, model.RememberBrowser, cancellationToken: Context.RequestAborted); var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, model.RememberMe, model.RememberBrowser, cancellationToken: Context.RequestAborted);
switch (result) if (result.Succeeded)
{ {
case SignInStatus.Success: return RedirectToLocal(model.ReturnUrl);
return RedirectToLocal(model.ReturnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid code.");
return View(model);
} }
if (result.IsLockedOut)
{
return View("Lockout");
}
else
{
ModelState.AddModelError("", "Invalid code.");
return View(model);
}
} }
// //
@ -346,22 +353,26 @@ namespace MusicStore.Controllers
// Sign in the user with this external login provider if the user already has a login // Sign in the user with this external login provider if the user already has a login
var result = await SignInManager.ExternalLoginSignInAsync(loginInfo.LoginProvider, loginInfo.ProviderKey, isPersistent: false, cancellationToken: Context.RequestAborted); var result = await SignInManager.ExternalLoginSignInAsync(loginInfo.LoginProvider, loginInfo.ProviderKey, isPersistent: false, cancellationToken: Context.RequestAborted);
switch (result) if (result.Succeeded)
{ {
case SignInStatus.Success: return RedirectToLocal(returnUrl);
return RedirectToLocal(returnUrl); }
case SignInStatus.LockedOut: if (result.RequiresTwoFactor)
return View("Lockout"); {
case SignInStatus.RequiresVerification: return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false }); }
case SignInStatus.Failure: if (result.IsLockedOut)
default: {
// If the user does not have an account, then prompt the user to create an account return View("Lockout");
ViewBag.ReturnUrl = returnUrl; }
ViewBag.LoginProvider = loginInfo.LoginProvider; else
// REVIEW: handle case where email not in claims? {
var email = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Email); // If the user does not have an account, then prompt the user to create an account
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email }); ViewBag.ReturnUrl = returnUrl;
ViewBag.LoginProvider = loginInfo.LoginProvider;
// REVIEW: handle case where email not in claims?
var email = loginInfo.ExternalIdentity.FindFirstValue(ClaimTypes.Email);
return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = email });
} }
} }
@ -437,7 +448,7 @@ namespace MusicStore.Controllers
{ {
foreach (var error in result.Errors) foreach (var error in result.Errors)
{ {
ModelState.AddModelError("", error); ModelState.AddModelError("", error.Description);
} }
} }

View File

@ -337,7 +337,7 @@ namespace MusicStore.Controllers
{ {
foreach (var error in result.Errors) foreach (var error in result.Errors)
{ {
ModelState.AddModelError("", error); ModelState.AddModelError("", error.Description);
} }
} }

View File

@ -174,7 +174,7 @@ namespace E2ETests
var content = new FormUrlEncodedContent(formParameters.ToArray()); var content = new FormUrlEncodedContent(formParameters.ToArray());
response = _httpClient.PostAsync("Account/Register", content).Result; response = _httpClient.PostAsync("Account/Register", content).Result;
responseContent = response.Content.ReadAsStringAsync().Result; responseContent = response.Content.ReadAsStringAsync().Result;
Assert.Contains(string.Format("Name {0} is already taken.", email), responseContent, StringComparison.OrdinalIgnoreCase); Assert.Contains(string.Format("UserName '{0}' is already taken.", email), responseContent, StringComparison.OrdinalIgnoreCase);
Console.WriteLine("Identity threw a valid exception that user '{0}' already exists in the system", email); Console.WriteLine("Identity threw a valid exception that user '{0}' already exists in the system", email);
} }