我有一个MVC3网站与管理网站和面向公众的网站。这些组件的控制器、视图、模型等都在同一个MVC项目中。它们是这样分开的:管理站点驻留在名为管理的MVC3区域中,面向公众的站点不属于某个区域,而是存在于顶层。管理站点有Login视图,公共站点也有Login视图。在我的web.config文件中有:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogIn" timeout="2880" />
</authentication>现在,如果我访问公共站点中需要身份验证的任何页面,我会被带到公共站点的登录页面,这很棒。但是,如果我访问管理区域中需要身份验证的任何页面,那么我将再次被带到公共站点的登录页面。那么问题是,如果我在管理区域中的页面上,需要身份验证,那么我如何确保我会被发送到管理员登录页面?
发布于 2012-01-17 22:43:58
当需要一个本地化的登录页面时,我也遇到过类似的问题。我创建了一个自定义Authorize属性:
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary
{
{ "language", filterContext.RouteData.Values[ "language" ] },
{ "controller", "Account" },
{ "action", "LogOn" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}只需使用此属性,而不是默认的Authorize属性。在您的情况下,您可以检查请求的url,并根据该重定向到适当的登录页面。
发布于 2012-01-17 22:43:39
您可以编写一个自定义Authorize属性并覆盖HandleUnauthorizedRequest方法,在该方法中,您可以测试请求是否是在管理员上发出的,并相应地进行重定向。
大致是这样的:
public class MyAuthorizeAttribute: AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var area = filterContext.RequestContext.RouteData.Values["area"] as string;
if (string.Equals("admin", area, StringComparison.OrdinalIgnoreCase))
{
// if the request was for a resource inside the admin area
// redirect to a different login page than the one in web.config
// in this particular case we redirect to the index action
// of the login controller in the admin area. Adapt this
// accordingly to your needs. You could also externalize this
// url in the web.config and fetch it from there if you want
var requestUrl = filterContext.HttpContext.Request.Url;
var urlHelper = new UrlHelper(filterContext.RequestContext);
var url = urlHelper.Action(
"index",
"login",
new
{
area = "admin",
returnUrl = requestUrl.ToString()
}
);
filterContext.Result = new RedirectResult(url);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}现在使用这个自定义authorize属性,而不是默认属性。
https://stackoverflow.com/questions/8896381
复制相似问题