我想保护整个网站,以便除登录页面之外的每个页面都需要用户进行身份验证。为了实现这一点,我在应用程序启动时注册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>
}
答案 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");
}
}
}