AuthorizeAttribute 和 IAuthenticationFilter 的区别
Difference between AuthorizeAttribute and IAuthenticationFilter
In 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());
一切正常,但是当我搜索 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
属性 和不成功的授权必须将其设置为非空值(将根据失败采取操作的处理程序)。这是默认实现的工作方式,如果需要自定义它,您应该遵循相同的模式。
In 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());
一切正常,但是当我搜索 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
属性 和不成功的授权必须将其设置为非空值(将根据失败采取操作的处理程序)。这是默认实现的工作方式,如果需要自定义它,您应该遵循相同的模式。