AuthorizeAttribute和IAuthenticationFilter之间的区别

时间:2015-02-23 07:38:12

标签: c# asp.net authentication asp.net-web-api authorization

在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());

一切正常,但是当我搜索互联网时,我找到了很多使用IAuthenticationFilter的开发人员,就像在本教程中一样:Authentication Filters in ASP.NET Web API 2

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

唯一的缺点是微软假设每个应用程序都基于用户和角色,通过使这些属性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; }

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