c# - 覆盖身份验证属性的用途是什么?

标签 c# asp.net .net web-services asp.net-web-api

我在当前的 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/

相关文章:

c# - 如何在 bool 方法上解析 "not all code paths return a value"?

c# - 什么时候显式使用 delegate 关键字而不是 lambda 是更好的做法?

asp.net - 从分层 sql 数据返回无序列表

asp.net - 如何跟踪生产环境中偶发的 ASP.NET 性能问题?

javascript - 选择时如何更改菜单颜色?

c# - 是否可以更改异步方法的任务创建选项?

c# - 引用项目时缺少项目依赖项

c# - 在组合框中使用资源的 XAML 全局化

c# - Azure 移动应用身份验证

c# - WPF Application是否需要继承System.Windows.Application基类?