第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

HttpContext 標(biāo)頭

HttpContext 標(biāo)頭

C#
LEATH 2022-12-24 14:47:10
我創(chuàng)建了這個(gè)類來(lái)從請(qǐng)求中獲取 Header 值。public class AuthenticationHeader{    private static  IHttpContextAccessor _httpContextAccessor;    public AuthenticationHeader(IHttpContextAccessor httpContextAccessor)    {        _httpContextAccessor = httpContextAccessor;    }    public string AuthHeader => _httpContextAccessor.HttpContext?.Request.Headers["Authorization"];}并且我已經(jīng)像這樣在我的 startup.cs 中注冊(cè)了它services.AddSingleton<AuthenticationHeader>();它像這樣被注入到我的其他課程中。public BaseClient(HttpClient client, ILogger<BaseClient> logger, AuthenticationHeader authHeader){    _client = client;    client.BaseAddress = new Uri("yrl");    client.DefaultRequestHeaders.Add("Accept", "application/json");    _logger = logger;    AuthHeader = authHeader;}現(xiàn)在我已經(jīng)將其注冊(cè)為Singleton. 因此,當(dāng)?shù)谝淮握{(diào)用我的 Api 并在標(biāo)頭中提供授權(quán)值時(shí),api 被成功調(diào)用,但問(wèn)題是當(dāng)我傳遞空的授權(quán)標(biāo)頭時(shí),它仍然成功調(diào)用了 api,因?yàn)樗鎯?chǔ)了由于單例而導(dǎo)致的舊標(biāo)頭值。我怎樣才能解決這個(gè)問(wèn)題?有沒(méi)有其他方法可以做我正在做的事情。
查看完整描述

1 回答

?
慕姐4208626

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊

嘗試使用HttpClientFactory添加了 Asp.Net Core 2.1 的 ,結(jié)合HttpMessageHandler以實(shí)現(xiàn)您正在嘗試做的事情。


ConfigureServices您可以在方法中注冊(cè) HttpClient


public void ConfigureServices(IServiceCollection services)

{

    services.AddHttpClient<BaseClient>(client =>

    {

        client.BaseAddress = new Uri("yrl");

        client.DefaultRequestHeaders.Add("Accept", "application/json");

        c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");

        c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");

    });

 }

使用上面的代碼,您BaseClient將通過(guò) DI 接收 HttpClient 實(shí)例。


為了驗(yàn)證/檢查,AuthHeader您可以HttpMessageHandler為已注冊(cè)的HttpClient. 消息處理程序的代碼很簡(jiǎn)單,如下所示:


public class AuthHeaderHandler : DelegatingHandler

{

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,

        CancellationToken cancellationToken)

    {

        if (!request.Headers.Contains("Authorization"))

        {

            return new HttpResponseMessage(HttpStatusCode.Forbidden)

            {

                Content = new StringContent("No Authorization header is present")

            };

        }


        return await base.SendAsync(request, cancellationToken);

    }

}

為了注冊(cè)上述處理程序,您的代碼將如下所示:


public void ConfigureServices(IServiceCollection services)

{

    services.AddTransient<AuthHeaderHandler>();

    services.AddHttpClient<BaseClient>(client =>

     {

         //code omitted for brevity

         ...

     })

      .AddHttpMessageHandler<AuthHeaderHandler>();

 }

如果需要,您可以在消息處理程序中注入任何需要的內(nèi)容。但是,無(wú)需在BaseClient. 要閱讀有關(guān) HttpClientFactory 和 HttpMessageHandlers 的更多信息,請(qǐng)參閱此鏈接和此。我希望這有幫助。


更新的答案


請(qǐng)查看使用 IHttpContextAccessor 并修改 HttpRequestMessage 的更具體的 HttpMessageHandler 示例,即在調(diào)用之前添加 Authorization 標(biāo)頭。您可以根據(jù)需要修改邏輯。


public class AuthHeaderHandler : DelegatingHandler

{

    private readonly HttpContext _httpContext;


    public AuthHeaderHandler(IHttpContextAccessor contextAccessor)

    {

        _httpContext = contextAccessor.HttpContext;

    }


    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,

        CancellationToken cancellationToken)

    {

        if (_httpContext != null)

        {

            var accessToken = await _httpContext.GetTokenAsync(TokenKeys.Access);

            if (!string.IsNullOrEmpty(accessToken))

            {

                // modify the request header with the new Authorization token

                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            }

        }


        return await base.SendAsync(request, cancellationToken);

    }

}

更新的答案 2


請(qǐng)查看我已上傳到 GitHub的簡(jiǎn)單解決方案。該解決方案甚至比我最初建議的還要簡(jiǎn)單。由于您沒(méi)有集成任何基于身份的身份驗(yàn)證/授權(quán),您可以簡(jiǎn)單地使用我稱之為 CustomActionFilter 的 CustomActionFilterValidateAuthHeader來(lái)檢查 AuthHeader 是否存在,如果不存在則返回通常的 403。


在 中ValidateAuthHeader,我使用了您之前發(fā)布的中間件代碼。然后,您可以簡(jiǎn)單地將此屬性添加到需要此檢查的 ActionMethods 或 Controllers 上。


請(qǐng)查看DataController和ValuesController。將DataController接收HttpClient將用于調(diào)用values端點(diǎn)的類型。ValidateAuthHeader出現(xiàn)在 上GetValues并將檢查 AuthHeader。如果它不存在,它將產(chǎn)生錯(cuò)誤。


[Route("api/[controller]")]

[ApiController]

public class DataController : ControllerBase

{

    private readonly MyHttpClient _client;


    public DataController(MyHttpClient client)

    {

        _client = client;

    }


    [ValidateAuthHeader]

    public async Task<IActionResult> GetValues()

    {

        var response = await _client.GetAsync("api/values");


        var contents = await response.Content.ReadAsStringAsync();


        return new ContentResult

        {

            Content = contents,

            ContentType = "application/json",

            StatusCode = 200

        };

    }

}

流程的其余部分與我最初建議的相同。調(diào)用將通過(guò)AuthHeaderHandler已HttpMessageHandler注冊(cè)的MyHttpClient. 請(qǐng)看一看Startup.cs。


處理程序?qū)z索HttpContextviaHttpContextAccessor并檢查AuthHeader. 如果存在,它將把它添加到 RequestMessage 參數(shù)中。


我希望這有幫助。如有任何問(wèn)題,請(qǐng)隨時(shí)提出。


不使用 HttpMessageHandler 設(shè)置 Auth Header


修改 MyHttpClient 并添加一個(gè)名為的公共方法SetAuthHeader


public class MyHttpClient

{

    private readonly HttpClient _httpClient;


    public MyHttpClient(HttpClient client)

    {

        _httpClient = client;

    }


    public void SetAuthHeader(string value)

    {

        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", value);

    }

}

然后在您的操作方法中調(diào)用此方法,因?yàn)榇藭r(shí)您將在 HttpContext.Request 中擁有 AuthHeader


[ValidateAuthHeader]

public async Task<IActionResult> GetValues()

{

    var authHeader = Request.Headers["Authorization"];


    _client.SetAuthHeader(authHeader.First());


    var response = await _client.GetAsync("api/values");


    var contents = await response.Content.ReadAsStringAsync();


    return new ContentResult

    {

        Content = contents,

        ContentType = "application/json",

        StatusCode = 200

    };

}

去掉AuthHeaderHandler注冊(cè),刪除AuthHeaderHandler。


查看完整回答
反對(duì) 回復(fù) 2022-12-24
  • 1 回答
  • 0 關(guān)注
  • 146 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)