我在MVC控制器中有以下方法,当用户未登录时,该方法重定向到登录页面。
[Authorize]
public ActionResult Search() {
return View();
}
[Authorize]
public ActionResult Edit() {
return View();
}
是否有快速/简单/标准的方法将第二个操作重定向到web.config文件中定义的页面以外的其他登录页面?
或者我必须做类似的事情
public ActionResult Edit() {
if (IsUserLoggedIn)
return View();
else
return ReturnRedirect("/Login2");
}
我认为可以通过创建自定义授权过滤器:
public class CustomAuthorization : AuthorizeAttribute
{
public string LoginPage { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.HttpContext.Response.Redirect(LoginPage);
}
base.OnAuthorization(filterContext);
}
}
在你的行动中:
[CustomAuthorization(LoginPage="~/Home/Login1")]
public ActionResult Search()
{
return View();
}
[CustomAuthorization(LoginPage="~/Home/Login2")]
public ActionResult Edit()
{
return View();
}
基于Web.config
的表单身份验证没有内置的这种功能(这适用于WinForms和MVC)。你必须自己处理它(通过HttpModule或ActionFilter,你提到的方法或任何其他方法)
我实现了user434917接受的答案,即使我被正确地重定向,我也收到错误“服务器无法在发送HTTP标头后设置状态”。在服务器日志中。搜索之后,我找到了解决问题的this post(由Mattias Jakobsson回答)。我把答案结合起来得到了这个解决方案。
创建自定义授权过滤器:
using System.Web.Mvc;
using System.Web.Routing;
namespace SomeNamespace.CustomFilters
{
public class CustomAuthorization : AuthorizeAttribute
{
public string ActionValue { get; set; }
public string AreaValue { get; set; }
public string ControllerValue { get; set; }
public override void OnAuthorization(AuthorizationContext context)
{
base.OnAuthorization(context);
if (context.HttpContext.User.Identity.IsAuthenticated == false)
{
var routeValues = new RouteValueDictionary();
routeValues["area"] = AreaValue;
routeValues["controller"] = ControllerValue;
routeValues["action"] = ActionValue;
context.Result = new System.Web.Mvc.RedirectToRouteResult(routeValues);
}
}
}
}
然后在您的控制器上,使用customer属性。
[CustomAuthorization(ActionValue = "actionName", AreaValue = "areaName", ControllerValue = "controllerName")]
public class SomeControllerController : Controller
{
//DO WHATEVER
}