在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;
}
}
比我已经将它添加到HttpConfiguration
这样:
config.Filters.Add(new IntegratedAuthorization());
一切正常,但是当我搜索互联网时,我找到了很多使用IAuthenticationFilter
的开发人员,就像在本教程中一样:Authentication Filters in ASP.NET Web API 2。
现在真正的问题,这两种方法有什么区别?我该怎么用?
谢谢!
答案 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
属性和不成功的授权必须将其设置为非空值(将根据失败采取操作的处理程序)。这是默认实现的工作方式,如果需要自定义,则应遵循相同的模式。