Mar*_*vin 7 validation asp.net-web-api
我的Web Api项目有问题.我有文件存储在我的数据库中,并希望直接在新窗口中调用它们来查看/保存(URL如:/ api/Files/5 - 5 beeing FileId)
我正在使用Bearer Token处理我的一般AJAX请求,使用AngularJS获取普通数据,它就像一个魅力.对于该文件,我创建了一个Controller,它在浏览器中显示具有相应MIME类型的文件.但现在我改变了行动[授权]我得到拒绝访问这是正确的,因为我没有通过的HTTP标头的的access_token.
如果可以通过查询字符串传递令牌但是没有找到任何有用的东西,我做了一些研究.
现在我的计划是从我的Controller中删除[Authorize]属性并尝试自己验证令牌,但我不知道如何.
有谁知道我怎么能让它工作?
小智 30
我在我的应用程序(AngularJS,WebAPI 2)中实现了承载令牌身份验证,我遇到了类似的问题 - 我需要通过单击链接来下载文件.当您单击链接时,不会发送标题.:(所以,我在查询字符串中发送了令牌值来下载文件
.../mywebapp/API /文件/ GETFILE/3?=的access_token ... jaCOTrGsaak6Sk0CpPc1
并将"Authorization"标头设置为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);
}
Run Code Online (Sandbox Code Playgroud)
尽管我不确定这是一个好主意,但您可以实施 aDelegatingHandler
来实现您想要的目标。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
该处理程序将查找名为的查询字符串"bearerToken"
,如果存在,则将其添加到请求标头中,以便后续处理程序/过滤器进行处理。您可能需要首先检查标头是否已经存在并且在这种情况下不被覆盖。您可以按照通常的方式在配置阶段添加此处理程序:
config.MessageHandlers.Insert(0, new QueryStringBearerToken ());
Run Code Online (Sandbox Code Playgroud)
的请求/YourRoute?bearerToken=theToken
将传入DelegatingHandler
,将查询字符串中传递的令牌添加到原始请求中的标头列表中,常规的承载令牌身份验证将查找该标头并找到它。
归档时间: |
|
查看次数: |
5977 次 |
最近记录: |