代码之家  ›  专栏  ›  技术社区  ›  Archeg

具有allowanonymous属性的WebAPI中的身份验证

  •  4
  • Archeg  · 技术社区  · 8 年前

    我通过继承实现了基于JWT的身份验证 DelegatingHandler 并将类添加为 configuration.MessageHandlers.Add(new MyDelegatingHandler()) .

    实施时 委托处理程序 ,我重写 Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) . 这里的逻辑很简单-我从 Authorization 头,检查它的有效性。如果有效-我设置 Thread.CurrentPrincipal HttpContext.Current.User ,否则我会回来 new HttpResponseMessage(HttpStatusCode.Unauthorized)

    基本上是这样的(非常简单):

    public class TokenValidationHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var token = GetTokenFromAuthorizeHeader(request);
            if (TokenIsValid(token)) {
               var principal = CreatePrincipal(token);
               Thread.CurrentPrincipal = principal;
               HttpContext.Current.User = principal;
               return base.SendAsync(request, cancellationToken);
            } else {
               // TODO: fix
               return Task<HttpResponseMessage>.Factory.StartNew(() => new HttpResponseMessage(HttpStatusCode.Unauthorized));
            }
        }
    }
    

    现在,即使在具有 [AllowAnonymous] 把它归因于它。这很好,因为即使方法允许匿名,我也希望设置主体。但如果提供的令牌 授权 头无效。

    用户向资源发送请求 [异基因] 和中的无效令牌 授权 头,应该通过,因为资源允许匿名,但我的代码检查授权,发现令牌无效并发送 HttpStatusCode.Unauthorized .

    解决方法是检查 // TODO: fix 是用户正在访问的资源是否允许匿名,并且仅发送 httpstatuscode.未经授权 如果不是的话,但我不知道如何正确地做到这一点。

    我该怎么做?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Yuriy Oborozhnyi    8 年前

    1。身份验证筛选器

    使用 Authentication Filters 介绍了Web API 2。他们只是表演而已 身份验证 ,但不要说用户是否有权访问资源。正是你需要的。

    public class JwtAuthenticationFilter : IAuthenticationFilter
    {
        public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
        {
            var token = GetTokenFromAuthorizeHeader(context.Request);
            if (TokenIsValid(token)) {
                var principal = CreatePrincipal(token);
                // Use context.Principal instead of Thread.CurrentPrincipal
                // and HttpContext.Current.User whenever.
                context.Principal = principal;
            }
            return Task.CompletedTask;
        }
    
        // TODO: Implement remaining IAuthencitaionFilter members.
    }
    

    应用这个 JwtAuthenticationFilter 全局为所有请求执行身份验证:

    // httpConfig is an instance of HttpConfiguration
    httpConfig.Filters.Add(new JwtAuthenticationFilter());
    

    通过这种方式,如果令牌正常,则对用户进行身份验证。但是,仍然所有用户都可以访问您的API,即使是令牌无效的用户。让我们更进一步保护它。

    2。授权属性

    AuthorizeAttribute 您需要限制未经身份验证的用户访问Web API。您可以使用与上面相同的方法全局应用它:

    httpConfig.Filters.Add(new AuthorizeAttribute());
    

    没有有效令牌的人不会通过。很好。最后一步是允许具有无效令牌的用户访问某些特定资源。

    三.allowanonymousAttribute属性

    从现在开始 AllowAnonymousAttribute 应该有效。基本上 AuthorizeAttribute 只检查资源是否由标记 [AllowAnonymous] 在这种情况下跳过授权。


    结论

    通常,Web API受到保护,不受未经身份验证的用户的影响,但某些资源可以通过应用 [异基因] . JWT身份验证筛选器 我们在任何情况下都实现了上述功能,因此具有有效令牌的用户将始终得到身份验证——即使资源允许匿名访问。

    推荐文章