C# Web API 2中非常基本的承载令牌身份验证和授权

C# Web API 2中非常基本的承载令牌身份验证和授权,c#,asp.net-web-api2,bearer-token,C#,Asp.net Web Api2,Bearer Token,我有一个内部网站,在我的组织内本地托管。同一网站还通过各种web服务公开一些数据。它是使用ASP.NETMVC5和WebAPI 2编写的,它是.NET4.5,而不是Core 目前,用户可以使用Windows身份验证登录到该网站,一旦通过身份验证,他们就可以访问API。但是,我还需要允许使用令牌访问API,以便它们可以被自动化流程查询,因此我创建了一个页面,经过身份验证的用户可以在其中请求令牌 我的意图是,这个令牌可以用作承载令牌,包含在Web API的HTTP请求头中,以允许访问API。据我所知

我有一个内部网站,在我的组织内本地托管。同一网站还通过各种web服务公开一些数据。它是使用ASP.NETMVC5和WebAPI 2编写的,它是.NET4.5,而不是Core

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

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

然而,我一直在努力寻找一个完整的、端到端的教程来验证和授权请求。这个网站上有一些问题和微软的算法,它们给出了一些很好的建议,但我觉得它们可能暗示了一些对我的要求来说太复杂的东西。我不需要用声明或类似的东西返回任何类型的身份,而且我根本不关心OAuth

我使用的是微软的WebAPI框架,因此可以合理地假设,从请求头中提取和检查令牌这样的基本操作应该相当简单


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

看起来我们也有同样的需要,我还需要一个快速的承载令牌验证,以避免API完全打开

我从这里复制了大部分内容,并对其进行了调整,使其只检查承载令牌

在WebApiConfig.cs中添加过滤器

public class WebApiConfig    
{    
    public static void Register(HttpConfiguration config)    
    {    
        // Add authentication    
        config.Filters.Add(new SimpleAuthenticationFilter()):  
        foo
    }  
}
SimpleAuthenticationFilter.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);
    }
}
AuthenticationFailureResponse.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;
    }
}
公共类身份验证失败结果:IHttpActionResult
{
公共身份验证失败结果(字符串原因短语、HttpRequestMessage请求)
{
推理短语=推理短语;
请求=请求;
}
私有字符串{get;}
私有HttpRequestMessage请求{get;}
公共任务执行同步(CancellationToken CancellationToken)
{
返回Task.FromResult(Execute());
}
私有HttpResponseMessageExecute()
{
var响应=新的HttpResponseMessage(HttpStatusCode.Unauthorized)
{
RequestMessage=Request,ReasonPhrase=ReasonPhrase
};
返回响应;
}
}

展开上面Min的答案:


string-token=Request.Headers.Authorization.ToString().Split(“”)[1]

您不需要手动执行任何操作,大多数操作已经包含在内。看看这些文档:我已经阅读了好几次这些文档,但我仍然不清楚简单地检查一个承载令牌所需的最低要求是什么——我不希望在我的项目中有太多我并不真正需要的引用和类。我确实需要手工做一些事情来验证令牌——我不知道文档中的默认代码对令牌的有效性,但是我需要对我的应用程序做一些检查,看看它是否有效。你在OWin上运行Web API吗?你有Startup.cs或Global.asax吗?我有Global.asax,但没有Startup.cs。我曾在尝试学习一些在线教程和其他一些库的同时,将OWIN添加到我的项目中,但在写这个问题之前,我把它们都去掉了,因为,我试图实现这一点,同时只添加我实际需要的引用。HTTP请求有一个带有承载令牌的授权头。如果需要,您可以手动解析它。伪代码-
request.Headers[“Authorization”].Split(“”[1]
应该为您提供令牌。