[英].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.