使用.Net HttpClient设置“按请求” cookie

帕维尔(Pavel Pykhtin)

嗨,我正在尝试使用Owin基础结构实现简单的http代理服务。此代理必须使用Windows身份验证对用户进行身份验证,从企业AD中获取用户的属性,将此信息作为cookie值添加到原始请求中,然后将请求重定向到Internet上的应用程序(称为外部应用程序)。

我正在使用HttpClient将请求发送到外部应用程序。

但是HttpClient不适用于此方案。似乎唯一允许使用它发送cookie的方法是将其放入CookieContainer并将此CookieContainer设置为HttpClientHandler的属性。如果您只有一个用户,则可以,但是在代理服务的情况下,来自不同用户的Cookie值将相互混合并覆盖。

有什么方法可以根据请求设置cookie或CookieContainer吗?或者,也许有更好的方法来重定向请求?

PS这是一些代码:

http处理程序的初始化:

    private void RegisterRoutes(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "Proxy",
            routeTemplate: "{*path}",
            handler: HttpClientFactory.CreatePipeline
                (
                    innerHandler: new HttpClientHandler(),
                    handlers: new DelegatingHandler[]
                    {
                        new ProxyHandler()
                    }
                ),
            defaults: new { path = RouteParameter.Optional },
            constraints: null);
    }

ProxyHandler内部类ProxyHandler:DelegatingHandler {私有只读HttpClient _client;

    public ProxyHandler()
    {
        var handler = new HttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Automatic};

        _client = new HttpClient(handler);
    }

    protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var forwardUri = new UriBuilder(request.RequestUri);
        forwardUri.Host = "localhost";
        forwardUri.Port = 23016;
        forwardUri.Scheme = Uri.UriSchemeHttp;

        request.RequestUri = forwardUri.Uri;
        request.Headers.Host = forwardUri.Host;

        //Explicitly null it to avoid protocol violation
        if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Trace)
            request.Content = null;

        try
        {
            var response = await _client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

            //Explicitly null it to avoid protocol violation
            if (request.Method == HttpMethod.Head)
                response.Content = null;
            return response;
        }
        catch (Exception ex)
        {
            var response = request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
            string message = ex.Message;
            if (ex.InnerException != null)
                message += ':' + ex.InnerException.Message;
            response.Content = new StringContent(message);
            Trace.TraceError("Error:{0}", message);
            return response;
        }
    }

    private void SetCookies(HttpRequestMessage request)
    {
        var container = new CookieContainer();

        var authCookieValue = "2EF91D8FD9EDC594F2DB82";
        var authCookie = new Cookie("cookieByProxy", authCookieValue);

        var targetUri = new Uri("http://localhost:23016/");
        container.Add(targetUri, authCookie);

        var cookieHeader = container.GetCookieHeader(targetUri);

        if (!string.IsNullOrEmpty(cookieHeader))
            request.Headers.TryAddWithoutValidation("Cookie", cookieHeader);//Overwriting cookie header with custom values. However cookie values are ignored by HttpClient (both old and new)
    }
}
帕维尔(Pavel Pykhtin)

在此处找到解决方案:在此处输入链接描述技巧是将HttpClientHandler的UseCookie标志显式设置为false

var handler = new HttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Automatic, UseCookie = false };

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Ajax请求设置Cookie

来自分类Dev

Cookie(使用ASP:NET读取)(使用javascript设置)

来自分类Dev

无法检索使用asp.net设置的Cookie中的PHP中的Cookie值

来自分类Dev

使用chai在请求上设置cookie

来自分类Dev

使用chai在请求上设置cookie

来自分类Dev

未使用 ajax 请求设置 Flask cookie

来自分类Dev

ReactJS .NET无法设置cookie

来自分类Dev

使用Javascript设置Cookie

来自分类Dev

使用GWT设置Cookie

来自分类Dev

使用NSURLSession设置cookie

来自分类Dev

使用Python请求在请求之间设置新的Cookie

来自分类Dev

.Net身份-使用伪造的cookie登录

来自分类Dev

使用Python请求发送Cookie

来自分类Dev

使用Cookie发送POST请求

来自分类Dev

使Ruby Net :: HTTP :: Get与Cookie的请求

来自分类Dev

无法在ASP.NET MVC下使用C#设置和获取Cookie

来自分类Dev

使用 JS 在 ASP .NET CheckBox 中设置 Cookie 不起作用

来自分类Dev

如何通过在 python 中使用请求来设置 cookie?

来自分类Dev

使用会话值设置Cookie

来自分类Dev

使用Javascript设置多个Cookie

来自分类Dev

使用表单输入设置Cookie

来自分类Dev

未使用HttpUrlConnection设置的Cookie

来自分类Dev

使用path = /的Javascript设置cookie

来自分类Dev

使用Cookie的ASP.NET Core .NET Framework测试

来自分类Dev

播放:未设置会话Cookie。无法使用Javascript读取Cookie

来自分类Dev

使用ngx-cookie-service在iframe网站上设置Cookie

来自分类Dev

播放:未设置会话Cookie。无法使用Javascript读取Cookie

来自分类Dev

使用按钮设置 cookie 并在 cookie 视图中显示值

来自分类Dev

使用HttpClient的Windows Phone 8.1上的Cookie