我有一个带有表单身份验证的MVC项目。
基本上,它工作得很好:用户希望使用Authorize-Attribute访问控制器,如果没有经过身份验证,就会被重定向到登录页面。在重定向时,参数returnUrl也会被转发。
但是,如果登录的第一次尝试失败,返回页面将不再工作。我认为returnUrl在第一次尝试之后被更改为帐户控制器,因为它在当前登录尝试之前使用最后一个页面。因此,身份验证似乎仍然有效,但用户仍然停留在登录页面上,不会被重定向到以前的页面。
是否有办法防止returnUrl在第一次登录失败后被更改?
发布于 2015-06-15 11:54:29
因为您的ViewBag的returnUrl在回发后设置为null,
只是简单地说
ViewBag.ReturnUrl = returnUrl;在你的HttpPost动词Login动作的开头。
发布于 2015-06-15 14:45:42
在开始阅读之前:我在这里使用实体框架代码-优先方法。userService是我的UserDBCotext类对象。UserDbContect是上下文类。
下面是简单的代码。您可以将它用于LogIn操作。也适用于多个登录。
主计长行动:
public ActionResult LogIn()
{
return View(new ForLogIn());
}
[HttpPost]
public ActionResult LogIn(ForLogIn user)
{
try
{
if(ModelState.IsValid)
{
var loggedUser=userService.Users.FirstOrDefault(i=>i.UserName==user.UserName && i.UserPassword==user.UserPassword);
if(loggedUser!=null)
{
FormsAuthentication.SetAuthCookie(user.UserName, false);
return View("LoggedIn", loggedUser);
}
else
{
ModelState.AddModelError("", "Username or password is incorrect, please try again");
return View(user);
}
}
else
{
return View(user);
}
}
catch (Exception ex)
{
ModelState.AddModelError("", ex.Message);
return View(user);
}
}带有脚手架的LogIN视图:
@model DataAccessLayer.Models.ForLogIn
@{
ViewBag.Title = "LogIn";
}
<h2>LogIn</h2>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>User</h4>
<hr />
@Html.ValidationSummary()
<div class="form-group">
@Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.UserPassword, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.PasswordFor(model => model.UserPassword)
@Html.ValidationMessageFor(model => model.UserPassword)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Log In" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>没有什么特别的,只有LoggedIn视图。您可以跳过它,创建您想要的任何视图:
@model DataAccessLayer.Models.User
@{
ViewBag.Title = "LoggedIn";
}
<h2>Congratulations @Model.UserName</h2>
<h3>You've Logged In successfully, please choose option below</h3>
<p>@Html.ActionLink("Home", "Index", "Home")</p>
<p>@Html.ActionLink("Start Test", "Start", "Test")</p>最后,我的用户类:
public class User
{
public int ID { get; set; }
[Required(ErrorMessage = "Please enter you name")]
[Display(Name = "Name")]
public string UserName { get; set; }
[Required(ErrorMessage = "Please enter you E-mail")]
[Display(Name = "E-mail")]
public string Email { get; set; }
[Required(ErrorMessage = "Please enter you Password")]
[Display(Name = "Password")]
[StringLength(50, MinimumLength = 6, ErrorMessage = "Password minimum length is 6 characters, maximum-50")]
public string UserPassword { get; set; }
[Required(ErrorMessage = "Please repeat your password")]
[Display(Name = "Repeate Password")]
[StringLength(50, MinimumLength = 6, ErrorMessage = "Repeated password minimum length is 6 characters, maximum-50")]
public string UserRepeatPassword { get; set; }
[Display(Name="Is Active")]
public bool IsActive { get; set; }
}https://stackoverflow.com/questions/30844214
复制相似问题