0

我从一位同事那里接手了一个 MVC 3 Razorview 项目。我创建了一个忘记密码的页面,但是当点击登录页面上的忘记密码链接时,网站会要求用户登录。我做了一些谷歌搜索并使用该属性实现了白名单操作的解决方案。[AllowAnonymous]然而,这并没有解决问题。

单步执行代码永远不会调用忘记密码操作。它被直接推送到帐户控制器上的登录操作。_ViewStart.cshtml即使忘记密码布局不使用它并且在代码中设置了布局,也会调用以下代码。

@{
    Layout = Request.IsAuthenticated ? "~/Views/Shared/_Layout.cshtml" : null;
}
4

2 回答 2

5

您必须将视图中使用的控制器的所有操作方法包含在白名单中(使用 [AllowAnonymous])。我在使用 RecoverPassword 页面时遇到了同样的问题,我意识到我的布局调用了一个不在白名单中的菜单方法。

于 2012-11-12T18:04:10.040 回答
2

你可以试试这个。http://blog.tomasjansson.com/2011/08/securing-your-asp-net-mvc-3-application/

更新

以下代码工作正常。它在基类本身中实现 ​​OnAuthorization。

public class MyBaseController : Controller
{
    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        var skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) ||
                            filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                                typeof(AllowAnonymousAttribute), true);
        if (!skipAuthorization)
        {
            base.OnAuthorization(filterContext);
            if (!User.Identity.IsAuthenticated)//Implement your own logic here
            {
                var url = new UrlHelper(filterContext.RequestContext);
                var logonUrl = url.Action("LogOn", "Home", new { reason = "NotAuthorized" });
                filterContext.Result = new RedirectResult(logonUrl);

            }
        }

    }
}

public class HomeController : MyBaseController 
{

    public ActionResult Index()
    {
        return View();
    }

    [AllowAnonymous]
    public ActionResult PasswordReset()
    {
        return Content("reset your password");
    }

    [AllowAnonymous]
    public ActionResult LogOn(string reason)
    {
        return Content("please log in");
    }
}

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class AllowAnonymousAttribute : Attribute
{
}
于 2012-08-07T03:34:27.037 回答