簡體   English   中英

.NET Web API 2 OWIN承載令牌身份驗證直接調用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM