gpt4 book ai didi

c# - MVC 5.0 [AllowAnonymous] 和新的 IAuthenticationFilter

转载 作者:可可西里 更新时间:2023-11-01 03:09:05 26 4
gpt4 key购买 nike

当我创建一个新的 asp.net mvc 4.0 应用程序时,我做的第一件事 就是创建并设置自定义授权全局过滤器,如下所示:

//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)
}
}

我有两个 Controller :HomeControllerSecureController

HomeController 用 [AllowAnonymous] 属性修饰。

SecureController 没有[AllowAnonymous] 属性修饰。

HomeControllerIndex() ActionResult 显示一个带有简单按钮的 View 。

当我点击按钮时,我对 SecureController 中的 GetData() 方法进行了 ajax 调用,如下所示:

$("#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 401) 与经过身份验证但碰巧未被授权的用户 (http 403))。

为了试用这个新的身份验证过滤器,我创建了一个新的 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();
}
}
}

我创建了一个 HomeControllerHomeController[AllowAnonymous] 属性修饰。

在从 VS 2013 启动应用程序之前,我在 CustomAuthenticationAttribute 的两个方法(OnAuthenticationOnAuthenticationChallenge)中设置了两个断点。

当我启动应用程序时,我遇到了第一个断点 (OnAuthentication)。然后,令我惊讶的是,我的 HomeControllerIndex() ActionResult 中的代码 被执行 并且只有在我返回 View() 之后我在 OnAuthenticationChallenge() 方法上遇到了断点。

问题:我有两个问题。

问题1)
我的印象是 [AllowAnonymous] 属性会自动绕过我的 CustomAuthenticationAttribute 中的任何代码,但我错了!我是否需要手动检查 [AllowAnonymous] 属性并跳过任何代码?

问题 2)为什么我的 HomeControllerIndex() 方法中的代码在 OnAuthentication 之后执行?才意识到在我返回 View() 之后 OnAuthenticationChallenge() 中的代码是否被执行了?

我担心的是,如果用户未通过身份验证,我不希望执行 Index() 方法中的代码。

也许我看错了。

如果有人能帮助我阐明这一点,那就太好了!

真诚的文斯

最佳答案

在回答问题 1 时:

[AllowAnnoymous] 属性就像一个标志(它实际上没有实现逻辑)。它的存在仅在执行 OnAuthorization 期间由 [Authorize] 属性检查。反编译 [Authorize] 属性揭示了逻辑:

        bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);

if (skipAuthorization)
{
return;
}

[AllowAnnonymous] 永远不会“自动”绕过您自定义属性中的代码...

所以问题 1 的后半部分的答案是:是的 - 如果您希望您的自定义属性对 [AllowAnnonymous] 的存在使用react,那么您需要为自定义 [Authorize] 属性中的 [AllowAnnonymous] 属性。

关于c# - MVC 5.0 [AllowAnonymous] 和新的 IAuthenticationFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19551113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com