我目前正在做一个简单的登录应用程序,它也允许用户更改其密码。但是,我的@Html.ActionLink
没有重定向到更改密码页面,我认为这是因为我在web.config中的设置。我该如何解决?
这是我的代码。
Index.chtml(登录页面)
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"> </script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<h2>@ViewBag.Title</h2>
@using(Html.BeginForm())
{
@Html.LabelFor(login => login.Username)
@Html.TextBoxFor(login => login.Username)<br/>
@Html.LabelFor(login => login.Password)
@Html.PasswordFor(login => login.Password)<br/>
<input type="submit" value="Login" />
@Html.ActionLink("Change Password", "Index", "ChangePW")
@Html.ValidationSummary()
}
@ViewBag.Error
的Web.config
<location>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
<location path="Content">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
<location path="Scripts">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
点击Change Password
后生成的HTML代码:
<div>
<h2>BlueBerry Login</h2>
<script src="/Scripts/jquery-1.5.1.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"> </script>
<link href="/Content/Site.css" rel="stylesheet" type="text/css" />
<h2></h2>
<form action="/Login?ReturnUrl=%2fChangePW" method="post">
<label for="Username">User name: </label>
<input data-val="true" data-val-required="The User name: field is required." id="Username" name="Username" type="text" value="" />
<br/>
<label for="Password">Password: </label>
<input data-val="true" data-val-required="The Password: field is required." id="Password" name="Password" type="password" />
<br/>
<input type="submit" value="Login" />
<a href="/ChangePW">Change Password</a>
<div class="validation-summary-valid" data-valmsg-summary="true">
<ul>
<li style="display:none"></li>
</ul>
</div>
</form>
</div>
更新
我在进入应用程序时尝试使用@Html.ActionLink
并且它有效。这真的很奇怪......
更新2
这是登录控制器的代码
public class LoginController : Controller
{
//
// GET: /Login/
#region Declarations
MembershipHelper _mem = new MembershipHelper();
#endregion
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(MasterUser user)
{
if (ModelState.IsValid)
{
if (_mem.ValidateUser(user.Username, user.Password)) //successful
{
FormsAuthentication.SetAuthCookie(user.Username, false);
user = _mem.LoggedUser;
Session["loggedUser"] = user;
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("",_mem.Status);
}
else
{
ModelState.AddModelError("", "User does not exist");
}
return View();
}
}
答案 0 :(得分:0)
错误答案,见下文
在你的web.config中,这个:
<location>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
只有登录用户才能访问您应用/网站中的所有网址。添加此
<location path="ChangePW">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
将您的“更改密码”页面从之前的规则中豁免,即使没有登录也可以访问。
您可以在此之后安全地放回@HtmlActionLink
,现在可以正常使用。
修改
显然,MVC routing does not work at all with the authorization stuff in web.config。如该链接的答案所述,只需将[Authorize]
添加到您希望在登录后限制的所有控制器操作。当然,您必须删除授权部分,拒绝web.config中的所有用户。
一种不那么乏味的方法可能是将ChangePassword操作移动到新控制器,然后您可以通过允许所有用户使用新控制器来使用web.config中的授权。