我在当前的Web API项目中遇到了一个标有System.Web.Http.OverrideAuthenticationAttribute
的控制器方法,我很好奇这是为了什么?
在Google和Stackoverflow中搜索无法回答这个问题。 MSDN documentation不包含太多信息。它只说以下内容:
表示覆盖身份验证过滤器的过滤器属性 在更高的层次上定义。
另外,我已经了解了消息来源:
public sealed class OverrideAuthenticationAttribute : Attribute, IOverrideFilter, IFilter
{
public bool AllowMultiple
{
get
{
return false;
}
}
public Type FiltersToOverride
{
get
{
return typeof(IAuthenticationFilter);
}
}
}
但这并没有太多亮点。
任何人都可以解释使用OverrideAuthenticationAttribute
的目的是什么?请提供一些使用案例以便更好地理解。
答案 0 :(得分:13)
OverrideAuthentication
属性用于禁止全局身份验证过滤器,这意味着使用此过滤器时将禁用所有全局身份验证过滤器(实现IAuthenticationFilter)。
假设您有一个名为BasicAuth
的全局身份验证过滤器:
public class BasicAuthAttribute : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{ }
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
var user = filterContext.HttpContext.User;
if (user == null || !user.Identity.IsAuthenticated)
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
}
使用以下代码将过滤器配置为所有控制器的全局过滤器:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new BasicAuthAttribute());
}
}
假设您想在单个控制器或控制器操作上使用不同的身份验证策略。在这种情况下,您可以禁用全局身份验证。使用OverrideAuthentication
属性过滤,然后配置要用于该特定操作的新过滤器。当您与外部登录提供程序集成时,这很有用,并且您不希望任何现有的全局身份验证筛选器弄乱您的外部登录身份验证。
在下面的代码中,全局身份验证过滤器被禁用,然后启用HostAuthentication
过滤器以执行单个操作以启用外部登录提供程序(例如Facebook):
// GET api/Account/ExternalLogin
[OverrideAuthentication]
[HostAuthentication(Startup.ExternalCookieAuthenticationType)]
[AllowAnonymous]
[HttpGet("ExternalLogin", RouteName = "ExternalLogin")]
public async Task<IHttpActionResult> ExternalLogin(string provider)
{
// Auth code
}
答案 1 :(得分:4)
OverrideAuthentication
用于覆盖在更高级别配置的身份验证过滤器。比如说,你有一个像这样全局应用的身份验证过滤器。
// Applied globally in WebApiConfig
config.Filters.Add(new MyAuthenticationFilter());
并且,您希望阻止此过滤器针对特定操作方法或控制器运行。您可以在该级别使用OverrideAuthentication
,如下所示。
public class ValuesController : ApiController
{
[OverrideAuthentication]
public string Get()
{ ... }
}
现在,在上面的示例中,您已全局应用MyAuthenticationFilter
。比如说,您想要覆盖它并运行另一个过滤器,仅对MyAnotherAuthenticationFilter
操作方法说Post
。你可以这样做。
public class ValuesController : ApiController
{
// Removes all filters applied globally or at the controller level
[OverrideAuthentication]
[MyAnotherAuthentication] // Puts back only MyAnotherAuthenticationFilter
public string Post(...)
{ ... }
}
更多信息here。查看“过滤器覆盖”部分。