C# Web API 2中非常基本的承载令牌身份验证和授权
我有一个内部网站,在我的组织内本地托管。同一网站还通过各种web服务公开一些数据。它是使用ASP.NETMVC5和WebAPI 2编写的,它是.NET4.5,而不是Core 目前,用户可以使用Windows身份验证登录到该网站,一旦通过身份验证,他们就可以访问API。但是,我还需要允许使用令牌访问API,以便它们可以被自动化流程查询,因此我创建了一个页面,经过身份验证的用户可以在其中请求令牌 我的意图是,这个令牌可以用作承载令牌,包含在Web API的HTTP请求头中,以允许访问API。据我所知,承载令牌本质上代表用户访问数据的权利,不需要任何其他信息(甚至用户名) 然而,我一直在努力寻找一个完整的、端到端的教程来验证和授权请求。这个网站上有一些问题和微软的算法,它们给出了一些很好的建议,但我觉得它们可能暗示了一些对我的要求来说太复杂的东西。我不需要用声明或类似的东西返回任何类型的身份,而且我根本不关心OAuth 我使用的是微软的WebAPI框架,因此可以合理地假设,从请求头中提取和检查令牌这样的基本操作应该相当简单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。据我所知
是否有人能够概述我需要在我的应用程序中设置的组件和流程,以允许它从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]
应该为您提供令牌。