当我创建一个新的 asp.net mvc 4.0 应用程序时,我做的第一件事就是创建并设置一个自定义授权global filter
,如下所示:
//FilterConfig.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthorizationAttribute());
}
然后我创建CustomAuthorizationAttribute
这样的:
//CustomAuthorizationAttribute.cs
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
//Handle AJAX requests
filterContext.HttpContext.Response.StatusCode = 403;
filterContext.Result = new JsonResult { JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
else
{
//Handle regular requests
base.HandleUnauthorizedRequest(filterContext); //let FormsAuthentication make the redirect based on the loginUrl defined in the web.config (if any)
}
}
我有两个控制器:HomeController
和SecureController
HomeController 用该[AllowAnonymous]
属性装饰。
SecureController没有用该[AllowAnonymous]
属性修饰。
的显示一个带有简单按钮的视图Index() ActionResult
。HomeController
当我单击按钮时,我对 GetData() 方法进行了 ajax 调用,该方法SecureController
如下所示:
$("#btnButton").click(function () {
$.ajax({
url: '@Url.Action("GetData", "Secure")',
type: 'get',
data: {param: "test"},
success: function (data, textStatus, xhr) {
console.log("SUCCESS GET");
}
});
});
不用说,当我单击按钮时,我触发了 ,CustomAuthorizationAttribute
因为它是一个全局过滤器,但也因为SecureController
没有用[AllowAnonymous]
属性装饰。
好了,介绍完了……
随着. asp.net mvc 5.0
_ authentication filter
_ _已通过身份验证并且碰巧没有被授权(http 403))。
为了authentication filter
尝试这个新功能,我创建了一个新的 asp.net mvc 5.0(VS Express 2013 for Web)并开始执行以下操作:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new CustomAuthenticationAttribute()); //Notice I'm using the word Authentication and not Authorization
}
然后是属性:
public class CustomAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
var user = filterContext.HttpContext.User;
if (user == null || !user.Identity.IsAuthenticated)
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
我创建了一个HomeController
. 用属性HomeController
装饰。[AllowAnonymous]
OnAuthentication
在从 VS 2013 启动应用程序之前,我在我的 CustomAuthenticationAttribute (和OnAuthenticationChallenge
)的两个方法中设置了两个断点。
当我启动应用程序时,我遇到了第一个断点 ( OnAuthentication
)。然后,令我惊讶的是,我的代码Index() ActionResult
被HomeController
执行了,只有在我返回 View() 之后,我才到达OnAuthenticationChallenge()
方法的断点。
问题: 我有两个问题。
问题 1)
我的印象是该[AllowAnonymous]
属性会自动绕过我的任何代码,CustomAuthenticationAttribute
但我错了!我是否需要手动检查属性是否存在[AllowAnonymous]
并跳过任何代码?
问题 2)为什么我的Index()
方法中的HomeController
代码在OnAuthentication
? 只是意识到在我返回 View() 后,里面的代码OnAuthenticationChallenge()
会被执行吗?
我担心的是,如果用户未通过身份验证,我不希望Index()
方法中的代码被执行。
也许我看错了。
如果有人可以帮助我阐明这一点,那就太好了!
真诚的文斯