簡體   English   中英

請求 oAuth2 不記名令牌的適當位置,以便它可以由 .NET Core web 應用程序中的注冊 HttpClient 使用

[英]Proper place to request an oAuth2 bearer token so it could be used by a registered HttpClient in a .NET Core web application

我正在創建一個需要從 ASP.NET 核心 Blazor 服務器應用程序調用外部 API 的客戶端。 我試圖找出一種干凈的方法來遵循此模式並從需要在所有調用中使用的 oAuth2 端點請求持有者令牌。 我目前通過以下方式設置 HttpClient:

在我的Program.cs 中:

builder.Services.AddHttpClient<IMyClient, MyClient>(client => {
    client.BaseAddress = new Uri("https://my-api/");
});

MyClient.cs中:

private readonly HttpClient _httpClient;
public MyClient(HttpClient httpClient) {
    _httpClient = httpClient;
}

public async Task<List<Project>?> GetProjectsAsync() {
    var projectResponse = await _httpClient.GetAsync("Projects");
}

我想知道首先調用發送 base64 機密的 oAuth2 端點的推薦方法是什么。 接收不記名令牌,用於 MyClient 向 https://my-api/ 發出的所有請求的 header。

我在這里找到了一個關於如何准備令牌請求的好例子: https://learn.microsoft.com/en-us/answers/questions/729834/create-client-token-oauth2-question.html

我只是對如何使用 .net 核心依賴項注入使其全部流動感到困惑。 我是否應該在我的 Program.cs 中添加所有代碼來請求令牌,然后在調用 AddHttpClient 時將令牌添加到標頭中? 或者這個邏輯應該在 MyClient.cs 文件中嗎?

要為來自 httpClient 的所有請求將令牌添加到 header,您可以像這樣實現 HttpMessageHandler:

public class HttpClientAuthorizationDelegatingHandler
   : DelegatingHandler
    {
        private readonly IHttpContextAccessor _httpContextAccessor;

        public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var authorizationHeader = _httpContextAccessor.HttpContext
                .Request.Headers["Authorization"];

            if (!string.IsNullOrEmpty(authorizationHeader))
            {
                request.Headers.Add("Authorization", new List<string>() { authorizationHeader });
            }

            var token = await GetToken();

            if (token != null)
            {
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
            }

            return await base.SendAsync(request, cancellationToken);
        }

        async Task<string> GetToken()
        {
            const string ACCESS_TOKEN = "access_token";

            return await _httpContextAccessor.HttpContext
                .GetTokenAsync(ACCESS_TOKEN);
        }
    }

然后在 program.cs 中定義 httpClient 時添加此處理程序:

builder.Services.AddHttpClient<TInterface, TImplementation>()
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>();

我在這里將此代碼與其他一些類一起使用,以使使用 httpClient 的生活更輕松一些。 也可作為nuget package

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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