私の英語で申し訳ありませんが、できる限りうまくやります。
rbacManager からオブジェクトを受け取り、Login メソッドを呼び出すエンティティ「Usuario」があります (以下を参照)。ご覧のとおり、このメソッドは、ユーザーとパスワードの両方が一致しない場合に例外をスローします。この場合、プロパティ Intentos をインクリメントして、ユーザーが失敗する機会を 3 回だけ許可する必要があります。
問題は次のとおりです。SaveChanges メソッドは、Usuario で変更された値を保存していません。例外のために SaveChanges メソッドが失敗していると思いますが、よくわかりません。ウェブ上でヘルプが見つかりませんでした。
これは、Action Method LogOn です。
using(EntitiesModel dbContext = new EntitiesModel())
{
try
{
string hPassword = FormsAuthentication.HashPasswordForStoringInConfigFile(model.Password, "SHA1");
Usuario usuario = this.rbacManager.Login(model.UserName, hPassword);
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
return RedirectToAction("Index", "Home");
}
catch (LoginIncorrectoException)
{
dbContext.SaveChanges();
ViewData["Message"] = "User incorrect.";
}
catch (UsuarioBloqueadoException)
{
ViewData["Message"] = "User locked";
}
return View(model);
}
そして、例外をスローする 4 行目の Login メソッド:
using (EntitiesModel context = new EntitiesModel())
{
Usuario usuario = this.GetUsuario(username);
if (usuario == null)
throw new LoginIncorrectoException();
if (!usuario.EstaActivo())
{
throw new UsuarioBloqueadoException();
}
if (usuario.Password != password)
{
usuario.Intentos++;
if (usuario.Intentos >= 3)
{
usuario.Activo = false;
context.SaveChanges();
throw new UsuarioBloqueadoException();
}
else
{
context.SaveChanges();
throw new LoginIncorrectoException();
}
}
usuario.Intentos = 0;
return usuario;
}
編集: GetUsuario メソッドをコピーします。
private Usuario GetUsuario(string username)
{
using (EntitiesModel context = new EntitiesModel())
{
List<Usuario> Usuarios = context
.Usuarios
.Where(x => x.Username == username)
.ToList();
if (Usuarios.Count == 1)
return Usuarios.First();
else
throw null;
}
}
SaveChanges が機能しない理由を知っている人はいますか? ありがとう!