19

在我的 .NET MVC 4 中,我添加了一个全局过滤器以保护我的控制器。这是使用以下方法完成的:

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 操作,但是当返回视图时,登录操作被调用,我永远无法真正到达所需的视图。出于某种原因,即使我使用了 [AllowAnonymous] 装饰,我的请求也会被拦截。

我在这里错过了什么吗?

提前致谢

更新1:

根据 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>
}
4

3 回答 3

11

视图使用的 _Layout 文件是否有可能ResetPasswordForUser在您的控制器(例如,在菜单中?)中调用一个尚未用 装饰的动作AllowAnonymous

这将导致这种行为。

于 2013-03-28T21:29:43.533 回答
3

听起来您的布局中可能有一个非匿名的 @Html.Action 或 Html.RenderAction,这会导致您的页面重定向到登录。

编辑:删除旧答案,因为它不正确,对任何来看它的人都没有用。

于 2013-03-18T04:01:52.823 回答
1

我不知道添加全局授权过滤器是否与 AllowAnonymous 冲突。我设置项目的方式是拥有一个在控制器级别设置 [Authorize] 属性的基本控制器。

我所有的控制器都继承自这个 BaseController,除了需要匿名访问的控制器,通常是我的 AccountController 和我的 MarketingController。那些只是从 Controller 继承,然后我可以在 Action 级别设置 [Authorize]。

于 2013-03-24T02:19:15.837 回答