HttpClient 将 ClaimsIdentity 传递给另一个 WebApi

Posted

技术标签:

【中文标题】HttpClient 将 ClaimsIdentity 传递给另一个 WebApi【英文标题】:HttpClient pass ClaimsIdentity to another WebApi 【发布时间】:2015-11-23 14:49:11 【问题描述】:

我使用透明代理,是否可以将声明身份传递给另一个 WebAPI?

我有两个 WebAPI,演示和应用,都使用 ADFS 进行身份验证。

到目前为止,我的代码用于处理应用程序 WebAPI 的演示请求

//Obtain ClaimsIdentity (Contains claims)
ClaimsPrincipal icp = Thread.CurrentPrincipal as ClaimsPrincipal;
ClaimsIdentity claimsIdentity = (ClaimsIdentity)icp.Identity;

var baseAddress = ConfigurationManager.AppSettings["ApplicationalWebApiUrl"] + "/" + url;

var http = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));

http.Accept = "application/json; charset=utf-8";
http.ContentType = "application/json; charset=utf-8";
http.Method = "GET";

//Doesn't pass the ClaimsIdentity
http.UseDefaultCredentials = true;

try

    //Get the requested data
    var response = http.GetResponse();

    var stream = response.GetResponseStream();
    var sr = new StreamReader(stream);
    var contentResponse = sr.ReadToEnd();

    return Request.CreateResponse(JsonConvert.DeserializeObject<Object>(contentResponse));

catch (Exception ex)

    return Request.CreateResponse(HttpStatusCode.BadRequest, ex.Message);

【问题讨论】:

“传递”凭据到另一个 webapi 与“委托”身份模拟相同 - 所以您可能需要将“request.ImpersonationLevel”设置为“委托” 你找到解决办法了吗? @HosseinNarimaniRad 不幸的是,没有。 如果您使用 OAuth,请查看bitoftech.net/2014/09/24/… 我自己意识到了这一点。最终使用访问令牌方法。 【参考方案1】:

在您的第一个API 从用户那里获得Auth 时,您只需将该信息传递给进一步的请求。您可以传播所有标头,或者仅使用 bearer token 传播 Authorization 标头(其中包含声明详细信息)。您可以将自定义数据添加到标题并在第二个API 侧读取它们。

您可以注册从当前请求中收集标头并将它们存储到单例 DI 服务的中间件(可以命名为HeadersPropagator)。当您创建 HttpClient 时,您可以从 HeadersPropagator 获取收集的标头并将它们复制到请求到您的第二个 API

【讨论】:

以上是关于HttpClient 将 ClaimsIdentity 传递给另一个 WebApi的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 HttpClient 配置为不保存 cookie?

将 JwtSecurityToken 与 HttpClient 一起使用

使用 POST 方法将 HttpWebRequest 转换为 HttpClient

如何将 Ninject 与 HttpClient 一起使用

尝试将 HttpClient.GetStreamAsync 直接用于 adls FileClient.UploadAsync

C#:HttpClient,将多个文件作为MultipartFormDataContent上传时的文件上传进度