当前位置: 首页 > 知识库问答 >
问题:

Web API 2中非常基本的承载令牌认证和授权

辛健
2023-03-14

我有一个内部网站点,在我的组织内本地托管。同一站点还通过各种web服务公开一些数据。它是用ASP.NET MVC 5和WebAPI 2编写的,它是。NET 4.5,非核心。

目前,用户可以使用Windows身份验证登录网站,一旦身份验证,他们就可以访问API。然而,我还需要允许使用令牌访问API,以便它们可以被自动进程查询,因此我创建了一个页面,经过身份验证的用户可以在其中请求令牌。

我的意图是,这个令牌可以用作承载令牌,包括在对Web API的HTTP请求的头中,以允许访问API。据我所知,承载令牌本质上代表用户访问数据的权利,不需要任何其他信息(甚至用户名)。

但是,我一直在努力寻找一个完整的端到端教程来验证和授权请求。这个网站和微软的aritcles上有一些问题,它们提供了一些很好的指针,但我觉得它们可能暗示了一些对于我的需求来说太复杂的东西。我不需要通过声明或类似的东西返回任何类型的身份,我根本不关心OAuth。

我正在使用Microsoft的Web API框架,因此可以合理地假设,执行像提取和检查请求标头中的令牌这样基本的事情应该相当简单!

是否有人能够概述我需要在应用程序中设置的组件和流程,以允许它从HTTP请求中提取承载令牌,使用我自己的代码检查其有效性,然后在令牌有效的情况下支持Web API方法上的<code>Authorize</code>属性?

共有2个答案

莫英喆
2023-03-14

对上面闵的回答进行扩展:

字符串令牌=Request.Headers.Authorization.ToString()。拆分('')[1];

梅跃
2023-03-14

看起来我们有同样的需求,我也只是需要一个快速的不记名令牌验证,不要让API完全开放。

我从这里复制了大部分内容,并对其进行了调整,使其只检查不记名令牌https://docs . Microsoft . com/en-us/aspnet/we b-API/overview/security/authentic ation-filters

在WebApiConfig.cs中添加过滤器

public class WebApiConfig    
{    
    public static void Register(HttpConfiguration config)    
    {    
        // Add authentication    
        config.Filters.Add(new SimpleAuthenticationFilter()):  
        foo
    }  
}

简单身份验证筛选器.cs

public class SimpleAuthenticationFilter : IAuthenticationFilter
{
    private readonly string _bearerToken = ConfigurationManager.AppSettings["simpleToken"];
    public bool AllowMultiple { get; }

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        // 1. Look for credentials in the request.
        var request = context.Request;
        var authorization = request.Headers.Authorization;

        // 2. If there are no credentials, do nothing.
        if (authorization == null)
        {
            context.ErrorResult = new AuthenticationFailureResult("Authorization header is 'null''", request);
            return;
        }

        // 3. If there are credentials but the filter does not recognize the 
        //    authentication scheme, do nothing.
        if (!authorization.Scheme.Equals("Bearer"))
        {
            context.ErrorResult = new AuthenticationFailureResult("Authentication type must be 'Bearer'", request);
            return;
        }

        // 4. If there are credentials that the filter understands, try to validate them.
        // 5. If the credentials are bad, set the error result.
        if (string.IsNullOrEmpty(authorization.Parameter))
        {
            context.ErrorResult = new AuthenticationFailureResult("Bearer token is null or empty", request);
            return;
        }

        if (!authorization.Parameter.Equals(_bearerToken))
        {
            context.ErrorResult = new AuthenticationFailureResult("Bearer token invalid", request);
        }
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {
        return Task.FromResult(0);
    }
}

身份验证失败响应.cs

  public class AuthenticationFailureResult : IHttpActionResult
  {
    public AuthenticationFailureResult(string reasonPhrase, HttpRequestMessage request)
    {
        ReasonPhrase = reasonPhrase;
        Request = request;
    }

    private string ReasonPhrase { get; }

    private HttpRequestMessage Request { get; }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(Execute());
    }

    private HttpResponseMessage Execute()
    {
        var response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
        {
            RequestMessage = Request, ReasonPhrase = ReasonPhrase
        };
        return response;
    }
}
 类似资料:
  • 当一个人试图使用azure AD承载令牌访问我们的系统时,这个获取和缓存资源令牌的工作流程是不存在的。 所以我的问题是,我如何使用承载令牌来启用它?如何才能像使用OpenIDConnect一样请求额外的资源令牌?是否可以使用ADAL从承载令牌获取授权代码?

  • 我真的很难找到一个AWS设计,让我: 使用REST(不使用AWS sdk库)向cognito验证实体。 cognito的RESTAPI需要识别实体并根据实体返回结果。例如,像“getOrders”这样的api将返回与已登录的实体关联的订单 经评估的解决方案: > 具有作用域的oAuth身份验证无法解决此场景。实体必须使用appclientId和secret进行身份验证,因此不清楚如何区分实体(为所

  • 我有几个azure函数,我想设置一个基于令牌的身份验证(使用承载令牌)。我想确保没有在HTTP头中传递承载令牌的用户不能访问azure函数。我正在使用可视代码/蔚蓝云。如有任何帮助或指导,将不胜感激。我有一种方法可以使用客户端id、secret和租户id来获得承载令牌,但是如何使其成为azure函数的必填字段呢?

  • 问题内容: 我正在.NET Web应用程序中实现Web API 2服务体系结构。使用请求的客户端是纯JavaScript,没有mvc / asp.net。我正在使用OWIN根据本文尝试启用令牌身份验证,并使用Web API Sample进行OWIN承载令牌身份验证 。授权后,我似乎在身份验证步骤中缺少某些内容。 我的登录名如下: 它返回 然后,我尝试在AngularJS中的其他请求上设置HTTP标

  • 我已经编写了一个云函数,该函数接收一个Base64字符串并将其传递到Google Cloud Vision API中,我还在客户端上编写了一个函数,该函数通过HTTP调用Firebase云函数。 虽然数据可以很好地从客户端传递到云功能,但服务器对Google Vision API的请求不起作用。我得到一个状态码错误。 我很确定这与授权承载令牌有关,因为在shell中使用环境变量运行它就可以了。顺便