Umbraco MVC - 如何在控制器中覆盖globa Authorize过滤器?

时间:2016-05-09 11:14:11

标签: asp.net-mvc authentication umbraco

我想保护整个网站,以便除登录页面之外的每个页面都需要用户进行身份验证。为了实现这一点,我在应用程序启动时注册Authorize过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new AuthorizeAttribute());
}

现在我的LoginController存在问题,尽管它已应用[AllowAnonymous]属性,但仍需要用户进行身份验证。这是我的登录控制器:

[AllowAnonymous]
public class LoginController : SurfaceController
{
    public LoginController()
    {
    }

    [HttpPost]
    [ValidateAntiForgeryToken]        
    [AllowAnonymous]
    public async Task<ActionResult> HandleLogin(LoginModel model, string returnTo)
    {
        return CurrentUmbracoPage();
    }
}

页面上没有其他子操作,问题最终与LoginController有关。这里发生了什么以及如何修复它?

更新:我的观点是

登录页面模板:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
    // Layout = "Master.cshtml";
    Layout = null;
}
    <div>@Umbraco.Field("bodyText")</div>
    @Html.Partial("Login")

登录部分是:

@using ClientDependency.Core.Mvc
@using PlayProj.Presentation.Controllers
@using Umbraco.Web
@using Umbraco.Web.Models

@{
    var loginModel = new LoginModel();

    Html.EnableClientValidation();
    Html.EnableUnobtrusiveJavaScript();

    Html
        .RequiresJs("~/scripts/jquery.validate.hooks.js", 200)
        .RequiresJs("~/scripts/foundation.form.validation.js", 201);
}

@using (Html.BeginUmbracoForm<LoginController>("HandleLogin", null, new { @class = "loginForm", autocomplete = "off" }))
{
    <fieldset>
        <legend>Login</legend>

        <button>Login</button>
    </fieldset>
}

2 个答案:

答案 0 :(得分:0)

您可以将默认控制器替换为具有Authorize属性的控制器,而不是注册全局过滤器。然后,默认情况下,所有没有被劫持路由的页面都将通过新的授权默认控制器进行路由。您可以在ApplicationStarting事件期间更改Umbraco中的默认控制器,如下所示:

DefaultRenderMvcControllerResolver.Current.SetDefaultControllerType(typeof(YourDefaultController));

答案 1 :(得分:0)

您可以实现自己的基本控制器并在那里处理授权,而不是使用全局AuthorizeAttribute

public class AuthorizedSurfaceController : SurfaceController
{
    protected override void OnAuthorization(AuthorizationContext filterContext)
    {
        var authorized = false; //get this from your provider
        if(!authorized)
        {
            filterContext.Result = new RedirectResult("/login");
        }
    }
}