在我的.NET MVC4中,我添加了一个全局过滤器来保护我的控制器。这是使用以下命令完成的:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}
它是从我的Global.cs类调用的。
我的Web.config文件包含一个标准配置:
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
我的登录操作使用[AllowAnonymous]
进行装饰,以便允许匿名用户登录。
到目前为止一切都很好,一切正常。以下是我的登录操作:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
现在,我想添加一个重置密码页面,就像登录页面应该对匿名用户可用一样。我创建了我的操作(在登录操作的同一个控制器下),并用[AllowAnonymous]
装饰它:
[AllowAnonymous]
public ActionResult ResetPasswordForUser(string message = "")
{
ViewBag.message = message;
return View();
}
然后创建相应的视图。
我将此链接添加到我的登录页面:
@Html.ActionLink("Forgot your password?", "ResetPasswordForUser", "Account")
在运行时,当我使用匿名用户单击此链接时,我会转到ResetPasswordForUser操作,但在返回视图时,会调用Login操作,并且我永远不会真正转到所需的视图。由于某些原因,即使我在使用AllowAnonymous装饰,我的请求也会被截获。
我是不是漏掉了什么?
提前感谢
Update1:
根据Darin Dimitrov添加我的ResetPasswordForUser视图的请求:
@using TBS.Models
@model TBS.ViewModels.ResetPasswordForUserViewModel
@{
ViewBag.Title = "Reset Password";
}
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<table class="edit-table rounded bordered" style="width: 400px">
<tr>
<td class="label-td">
@Html.LabelFor(m => m.Username)
</td>
<td>
@Html.TextBoxFor(m => m.Username)
@Html.ValidationMessageFor(model => model.Username)
</td>
</tr>
<tr>
<td class="label-td">
@Html.LabelFor(m => m.Password)
</td>
<td>
@Html.Password("Password")
@Html.ValidationMessageFor(model => model.Password)
</td>
</tr>
<tr>
<td colspan="2" style="text-align: center">
<input type="submit" value="Reset" />
</td>
</tr>
</table>
}
发布于 2013-03-29 05:29:44
ResetPasswordForUser
视图使用的_Layout文件是否可能正在调用控制器中的操作(例如,在菜单中?)还没有用AllowAnonymous
装饰过的?
这将导致这种类型的行为。
发布于 2013-03-18 12:01:53
听起来您可以在布局中使用非匿名@Html.Action或Html.RenderAction,这会导致您的页面重定向到登录。
编辑:删除了旧答案,因为它是不正确的,对任何来看它的人都没有用。
发布于 2013-03-24 10:19:16
我不知道添加全局授权筛选器是否与AllowAnonymous冲突。我设置项目的方法是拥有一个在控制器级设置了Authorize属性的Base Controller。
我的所有控制器都继承自这个BaseController,除了需要匿名访问的控制器,通常是我的AccountController和我的MarketingController。它们只是从Controller继承而来,然后我可以在Action级别设置Authorize。
https://stackoverflow.com/questions/15205545
复制相似问题