这是我的问题,改写为:
我有一台具有安全api端点的Web服务器-必须先通过Google认证,然后才能使用它们。我为此实现了Challenge
和Callback
端点。
这在带有SPA Web前端的浏览器中很好用。用户被重定向到Google网站以登录,然后被重定向回我的webapp;然后浏览器将具有经过身份验证的cookie,并且Webapp可以使用端点来更新其状态。
我还有一个WPF应用程序,它将与Web服务器通信。我希望WPF应用程序执行与Web前端相同的操作:在通过Google身份验证后,使用Web api端点。 WPF应用程序和我的Web服务器之间的连接是通过HttpClient完成的。
我的问题是我不知道如何验证WPF应用程序和Web服务器之间的HttpClient连接。
我尝试使用相同的Challenge
端点,但是我得到的响应当然是Google登录页面中的HTML,所以我想我不能将其与HttpClient一起使用...
我还尝试从WPF应用程序使用GoogleApis进行身份验证,并使用经过身份验证的令牌在HttpClient
中设置cookie,但显然这不兼容。
如何通过外部提供商(例如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
对象包含已验证的令牌:
如何将此令牌信息嵌入到用HttpClient
发出的Web请求中以调用我的webapi端点?
我认为请求中必须包含一些cookie才能通知服务器它已通过身份验证,但是我不知道确切地是哪个cookie。
服务器端的端点通过IdentityServer验证用户的身份已得到验证:
var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
throw new Exception("External authentication error");
}
也许您会在下面找到有用的提示,以更好地了解OpenID:)
混淆源于混合使用GoogleApis和IdentityServer框架。认证/授权可以使用它们之一来实现。Google.Apis.Auth.OAuth2和IdentityServer4命名空间中的对象并非旨在进行交互。当然,不需要手动处理cookie。
问问Google,谁向用户提供信任。如果回叫WPF,则信任WPF的webapi是一个单独的问题。