AuthorizeAttribute和IAuthenticationFilter之间的区别

Ben*_*dEg 6 c# asp.net authentication authorization asp.net-web-api

在ASP.Net Web API 2(Owin)中,IAuthenticationFilter和之间有什么区别AuthorizeAttribute

目前我通过创建我自己的授权来实现我的授权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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

config.Filters.Add(new IntegratedAuthorization());
Run Code Online (Sandbox Code Playgroud)

一切正常,但是当我搜索互联网时,我发现很多开发人员都在使用IAuthenticationFilter,就像在本教程中一样:ASP.NET Web API 2中的身份验证过滤器.

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

谢谢!

Nig*_*888 0

AuthorizeAttribute是为应用程序授权而实现的类。您正在遵循正确的方法。

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

由于AuthorizeAttribute实现了IAuthorizationFilter,您仍然可以访问它的所有功能,包括OnAuthorizationFarhad 提到的方法。

唯一的缺点是 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; }
Run Code Online (Sandbox Code Playgroud)

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

  • 也许值得注意的是,IAuthenticationFilter(如问题中提到的)和 IAuthorizationFilter 是两个不同的东西。 (6认同)
  • 正如@mcintyre321 所提到的,这是回答一个不同的问题。 (3认同)