自定义授权属性&表单身份验证

时间:2012-12-21 15:40:13

标签: c# asp.net-mvc asp.net-mvc-3 forms-authentication

我有一个自定义授权属性,到目前为止看起来像这样: (我稍后会添加更多逻辑。我只想先看看这个工作。)

public class CustomAuthorizeAttribute : AuthorizeAttribute
{

    public override void OnAuthorization(AuthorizationContext filterContext)
    {

        base.OnAuthorization(filterContext);
    }

}

然后我将我的属性放到控制器上:

[CustomAuthorize(Order = 0)]
public class MyController : Controller

现在,

这一切都运作良好&花花公子,直到我的表单身份验证用完为止。

I.E

<forms loginUrl="~/myController/myMethod" timeout="30" /> // this timout expires.

超时后,我的自定义授权属性不再被命中,相反,表单auth模块似乎接管了。

超时后,表单auth模块只返回由上面webconfig代码中指定的操作呈现的视图。

我想在超时到期时拦截onAuthorize操作,因此我可以查询HttpContext以查找某些内容,并有条件地重定向用户。

有没有人做过类似的事情?

2 个答案:

答案 0 :(得分:1)

实际上是默认行为


如果您在未对用户进行身份验证时处理了什么情况,则覆盖:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
      //your logic
      //...
      //...

      base.HandleUnauthorizedRequest(filterContext);
}

或者您可以从ActionFilterAttribute继承并检查自定义操作过滤器中是否对用户进行了身份验证。这将允许您绕过您遇到的Forms身份验证问题。

有些事情是这样的:

public class CustomAuthorizeAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
                {
                    //code that handles unauthorized ajax request
                }
                else
                {
                    //code that handles http request
                }
            }

            //you custom authorization logic

        }
    }

答案 1 :(得分:0)

您可以将代码插入HttpApplication.AcquireRequestState以监视身份验证是否有效并在该点重定向。请查看MSDN以获取有关该活动的更多信息。