0

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

public class CustomAuthorizeAttribute : AuthorizeAttribute
{

    public override void OnAuthorization(AuthorizationContext filterContext)
    {

        base.OnAuthorization(filterContext);
    }

}

然后我把我的属性放到一个控制器上:

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

现在,

这一切都很好,花花公子,直到我的表单身份验证用完。

IE

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

在此超时之后,我的自定义授权属性不再受到打击,相反,表单身份验证模块似乎接管了。

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

我想在超时过期时拦截 onAuthorize 操作,所以我可以询问 HttpContext 某些事情,并有条件地重定向用户。

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

4

2 回答 2

1

实际上,默认行为


如果您要处理用户未通过身份验证覆盖的情况:

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

      base.HandleUnauthorizedRequest(filterContext);
}

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

像这样的一些事情:

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

        }
    }
于 2012-12-21T15:43:27.133 回答
0

您可以将代码插入 HttpApplication.AcquireRequestState 以观察身份验证是否不再有效并在此时重定向。查看MSDN以获取有关该事件的更多信息。

于 2012-12-21T15:48:13.043 回答