如何与外部提供商(Google)认证HttpClient连接

问题描述 投票:0回答:1

编辑:

这是我的问题,改写为:

我有一台具有安全api端点的Web服务器-必须先通过Google认证,然后才能使用它们。我为此实现了ChallengeCallback端点。

这在带有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对象包含已验证的令牌:

enter image description here

如何将此令牌信息嵌入到用HttpClient发出的Web请求中以调用我的webapi端点?

我认为请求中必须包含一些cookie才能通知服务器它已通过身份验证,但是我不知道确切地是哪个cookie。

服务器端的端点通过IdentityServer验证用户的身份已得到验证:

var result = await HttpContext.AuthenticateAsync(IdentityServer4.IdentityServerConstants.ExternalCookieAuthenticationScheme);
if (result?.Succeeded != true)
{
    throw new Exception("External authentication error");
}
c# .net asp.net-web-api openid google-authentication
1个回答
0
投票

也许您会在下面找到有用的提示,以更好地了解OpenID:)

混淆源于混合使用GoogleApis和IdentityServer框架。认证/授权可以使用它们之一来实现。Google.Apis.Auth.OAuth2和IdentityServer4命名空间中的对象并非旨在进行交互。当然,不需要手动处理cookie。

问问Google,谁向用户提供信任。如果回叫WPF,则信任WPF的webapi是一个单独的问题。

© www.soinside.com 2019 - 2024. All rights reserved.