我在当前的 Web API 项目中遇到了一个标有 System.Web.Http.OverrideAuthenticationAttribute
的 Controller 方法,我很好奇这是做什么用的?
在 Google 和 Stackoverflow 中搜索无法回答问题。 MSDN documentation不包含太多信息。它只说了以下内容:
Represents a filter attribute that overrides authentication filters defined at a higher level.
此外,我已经查看了来源:
public sealed class OverrideAuthenticationAttribute : Attribute, IOverrideFilter, IFilter
{
public bool AllowMultiple
{
get
{
return false;
}
}
public Type FiltersToOverride
{
get
{
return typeof(IAuthenticationFilter);
}
}
}
但这并没有说明什么。
那么有人可以解释使用OverrideAuthenticationAttribute
的目的是什么吗?并请给出它的一些用例以便更好地理解。
最佳答案
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();
}
}
}
过滤器被配置为所有 Controller 的全局过滤器,代码如下:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new BasicAuthAttribute());
}
}
假设您想对单个 Controller 或 Controller 操作使用不同的身份验证策略。在那种情况下,您可以禁用全局身份验证。使用 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
}
关于c# - 覆盖身份验证属性的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549726/