【发布时间】:2015-03-28 18:31:10
【问题描述】:
我有 4 个控制器,即 Account、Admin、Home 和 Gallery。在这 4 个控制器中,我只需要授权 Admin 控制器,其余的可以匿名访问。所以我用[AllowAnonymous] 属性装饰了我的家庭控制器、画廊控制器和帐户控制器,我的Admin 控制器用我的名为[CustAuthFilter] 的自定义授权过滤器进行了装饰,它包含以下代码。
public class CustAuthFilter : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var request = httpContext.Request;
string controller = request.RequestContext.RouteData.Values["controller"].ToString().ToLower();
if (controller != "" && controller == "admin")
{
var isAuthorized = base.AuthorizeCore(httpContext);
if (!isAuthorized)
{
return false;
}
else
{
if (!object.ReferenceEquals(httpContext.Session["un"], null))
{
return true;
}
else
{
return false;
}
}
}
else
{
return true;
}
}
override public void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest())
{
String url = System.Web.Security.FormsAuthentication.LoginUrl + "?X-Requested-With=XMLHttpRequest";
filterContext.Result = new RedirectResult(url);
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
String url = System.Web.Security.FormsAuthentication.LoginUrl;
filterContext.Result = new RedirectResult(url);
}
}
在我的 web.config 中,我关注了
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" defaultUrl="~/Admin/Index" timeout="2880" protection="Encryption" slidingExpiration="true" cookieless="AutoDetect"/>
</authentication>
<authorization>
<deny users="?"/>
</authorization>
并且我已经在过滤器中注册了我的自定义授权属性,如下所示:
filters.Add(new CustAuthFilter());
但每当我尝试访问domainname/home 或domainname/gallery 时,它都会自动重定向到domainname/account/login。但我不知道为什么即使在使用[AllowAnonymous] 装饰家庭和画廊控制器之后,它仍会重定向到帐户控制器!!
【问题讨论】:
-
AuthorizeCore 中的断点是否被命中?
-
是的@praveenpaulose.. 但在它命中之前它将被路由到帐户控制器。
-
如果你只需要允许匿名访问 home,gallery 为什么不从这些控制器中删除 Authorize 属性?
-
@praveenpaulose。我没有向主页、画廊或帐户控制器添加任何授权属性,并且我已经清楚地提到了这一点。
-
很抱歉。监督。
标签: c# asp.net-mvc authorization custom-authentication