c# - 如何验证与外部提供商 (Google) 的 HttpClient 连接
问题描述
编辑:
这是我重新提出的问题:
我有一个带有安全 api 端点的网络服务器——在使用它们之前必须通过谷歌的身份验证。我为此实现Challenge
了Callback
端点。
这在带有我的 SPA Web 前端的浏览器中运行良好。用户被重定向到谷歌网站进行登录,然后被重定向回我的 webapp;然后浏览器拥有经过身份验证的 cookie,并且 webapp 可以使用端点来更新其状态。
我还有一个将与 Web 服务器通信的 WPF 应用程序。我希望 WPF 应用程序与 Web 前端一样:在通过 Google 身份验证后使用 Web api 端点。WPF 应用程序和我的 Web 服务器之间的连接是通过 HttpClient 完成的。
我的问题是我不知道如何验证 WPF 应用程序和 Web 服务器之间的 HttpClient 连接。
我尝试使用相同的Challenge
端点,但我得到的响应当然是来自 Google 登录页面的 HTML,所以我想我不能将它与 HttpClient 一起使用......
我还尝试从 WPF 应用程序使用 GoogleApis 进行身份验证,并使用经过身份验证的令牌在其中设置 cookie,HttpClient
但显然这不兼容。
如何使用 Google 等外部提供商验证与 Web api 的 HttpClient 连接?
原始问题:
在 WPF 应用程序中,用户使用以下代码向 Google 进行身份验证:
using Google.Apis.Auth.OAuth2;
...
public void Authenticate()
{
UserCredential credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
new ClientSecrets
{
ClientId = "myClientId",
ClientSecret = "myClientSecret"
},
new[] { "email", "openid" },
"user",
CancellationToken.None).Result;
}
这有效,并且UserCredential
对象包含经过身份验证的令牌:
如何将此令牌信息嵌入到使用 an 发出的 Web 请求HttpClient
中以调用我的 webapi 端点?
我认为请求必须包含一些 cookie 以通知服务器它已经过身份验证,但我不知道具体是哪些。
服务器端的端点在 IdentityServer 的帮助下验证用户是否经过身份验证:
var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
throw new Exception("External authentication error");
}
解决方案
如果我的问题正确,您只需设置Authorization
标题
var credentials = await GoogleWebAuthorizationBroker.AuthorizeAsync(
clientSecrets,
new[] { "email", "openid" },
"user",
CancellationToken.None);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
credentials.Token.TokenType,
credentials.Token.IdToken);
推荐阅读
- javascript - 使用 JSON 填充选择下拉列表时出现问题
- java - 谷歌地图无法在 Android 应用程序中呈现
- css - 具有偶数项的 Css 网格行
- operating-system - PintOS 用户程序不打印
- python - Python SQLite3 SELECT 导致向量数组
- java - 连接远程服务器时出现Orientdb连接问题
- multithreading - 乐观并发控制说明
- android - 无法在 Android Studio 上安装 GPU 调试工具
- c# - 我可以添加 NuGet 包作为运行时依赖项吗?
- regex - 如何使用正则表达式在两个随机文本之间获取文本