[英].NET Web API 2 OWIN Bearer Token Authentication direct call
我的Web Api项目有问题。 我将文件存储在数据库中,并希望在新窗口中直接调用它们以查看/保存(URL:/ api / Files / 5-5 beeing FileId)
对于AngularJS对于常规数据的常规AJAX请求,我可以使用Bearer Token进行任何工作,它的工作原理就像一个魅力。 我为该文件创建了一个Controller,该Controller在浏览器中显示相应的MIME类型的文件。 但是,现在我将操作更改为[Authorize],我得到了正确的访问被拒绝,因为我没有在HTTP标头中传递access_token。
如果可以通过查询字符串传递令牌,我做了很多研究,但没有发现任何帮助。
现在,我的计划是从控制器中删除[Authorize]属性,然后尝试自己验证令牌,但我不知道如何做。
有人知道我怎样才能使它工作吗?
我在应用程序(AngularJS,WebAPI 2)中实现了承载令牌身份验证,并且遇到了类似的问题-我需要允许通过单击链接来下载文件。 当您单击链接时,不发送标题。 :(因此,我在查询字符串中发送了令牌值以下载文件
... / mywebapp / api / files / getfile / 3?access_token = jaCOTrGsaak6Sk0CpPc1 ...
并将“授权”标头设置为Startup.Auth.cs中的令牌值。 这是代码:
public void ConfigureAuth(IAppBuilder app)
{
//It needs for file downloads
app.Use(async (context, next) =>
{
if (context.Request.QueryString.HasValue)
{
if (string.IsNullOrWhiteSpace(context.Request.Headers.Get("Authorization")))
{
var queryString = HttpUtility.ParseQueryString(context.Request.QueryString.Value);
string token = queryString.Get("access_token");
if (!string.IsNullOrWhiteSpace(token))
{
context.Request.Headers.Add("Authorization", new[] { string.Format("Bearer {0}", token) });
}
}
}
await next.Invoke();
});
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(OAuthOptions);
}
对于ASP .Net Core,我根据Forward的回答做了类似的事情
扩展方式
public static void UseQueryStringBearerValidation(this IApplicationBuilder app)
{
//It needs for file downloads
app.Use(async (context, next) =>
{
if (context.Request.QueryString.HasValue)
{
if (string.IsNullOrWhiteSpace(context.Request.Headers["Authorization"].ToString()))
{
var queryString = QueryHelpers.ParseQuery(context.Request.QueryString.Value);
var token = queryString["access_token"].ToString();
if (!string.IsNullOrWhiteSpace(token))
{
context.Request.Headers.Add("Authorization", new[] {$"Bearer {token}"});
}
}
}
await next();
});
}
用法
StartUp.cs-> Configure()方法
app.UseCustomExceptionHandler();
app.UseQueryStringBearerValidation(); // <-- add before Jwt Handler
app.UseCustomJwtBearerValidation();
app.AddHttpContextProperties();
app.UseStaticFiles();
app.UseMvc(MiddlewareAppConfiguration.AddRouteMappings);
尽管我不确定这是一个好主意,但是您可以实现DelegatingHandler
来实现所需的功能。
public class QueryStringBearerToken : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var bearerToken = request.GetQueryNameValuePairs()
.Where(kvp => kvp.Key == "bearerToken")
.Select(kvp => kvp.Value)
.FirstOrDefault();
if(!String.IsNullOrEmpty(bearerToken))
{
request.Headers.Add("Authorization", "Bearer " + bearerToken);
}
return base.SendAsync(request, cancellationToken);
}
}
该处理程序将查找名为"bearerToken"
的查询字符串,如果存在,会将其添加到请求标头中,以供后续处理程序/过滤器处理。 您可能需要首先检查标题是否已经存在,并且在这种情况下不进行覆盖。 您可以按常规方式在配置阶段添加此处理程序:
config.MessageHandlers.Insert(0, new QueryStringBearerToken ());
对/YourRoute?bearerToken=theToken
将在DelegatingHandler
传递,将在查询字符串中传递的令牌添加到原始请求的标头列表中,常规的Bearer Token身份验证将查找标头并找到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.