AuthorizeAttribute 和 IAuthenticationFilter 的区别

Difference between AuthorizeAttribute and IAuthenticationFilter

In ASP.Net Web API 2 (Owin), IAuthenticationFilterAuthorizeAttribute 有什么区别?

目前我已经通过创建自己的 AuthorizeAttribute 来实现我的授权:

public class IntegratedAuthorization : AuthorizeAttribute
{
    protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        bool returnValue = false;

        if (actionContext.Request.Headers.Authorization != null)
        {
            if (actionContext.Request.Headers.Authorization.Scheme != null)
            {
                if (actionContext.Request.Headers.Authorization.Scheme.ToLower() == "basic")
                {
                    if (actionContext.Request.Headers.Authorization.Parameter != null)
                    {
                        // ....
                        // ....
                        // ....
                    }
                }
            }
        }

        return returnValue;
    }
}

比起我把它添加到我的 HttpConfiguration 这样的:

config.Filters.Add(new IntegratedAuthorization());

一切正常,但是当我搜索 Internet 时,我发现很多开发人员使用 IAuthenticationFilter,例如本教程中的:Authentication Filters in ASP.NET Web API 2.

现在真正的问题是,这两种方法有什么区别?我应该使用什么?

谢谢!

AuthorizeAttribute 是应用程序授权实施的class。您正在遵循正确的方法。

IAuthorizationFilter是一个更通用的接口,很多过滤器都实现了,但不一定都提供授权。虽然 MVC 不太关心这种方式,但 唯一方式 3rd 方库可以识别应用程序中的授权组件,从而插入进入应用程序的安全是检查它是否继承AuthorizeAttribute。底线是,如果您的授权组件不继承 AuthorizeAttribute,某些第 3 方库可能无法在您的应用程序中正常运行。

由于 AuthorizeAttribute 实现了 IAuthorizationFilter,您仍然可以使用它的所有功能,包括 Farhad 提到的 OnAuthorization 方法。

唯一的缺点是 Microsoft 假设每个应用程序都将通过 AuthorizeAttribute 的这些属性基于用户和角色。因此,如果您的应用程序不是,您可能需要在实现中隐藏这些属性。

[Obsolete("Not applicable in this class.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
new public string Roles { get; set; }

[Obsolete("Not applicable in this class.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
new public string Users { get; set; }

第 3 方需要一个额外的约束才能插入您的应用程序安全性 - 如果您覆盖 OnAuthorization(请注意,您不必这样做)成功授权很重要 return null 对于 actionContext.Response 属性 和不成功的授权必须将其设置为非空值(将根据失败采取操作的处理程序)。这是默认实现的工作方式,如果需要自定义它,您应该遵循相同的模式。