Oauth 2.0 从.NET Core上的WPF桌面应用程序验证Azure AD(auth 2.0)WebAPI

Oauth 2.0 从.NET Core上的WPF桌面应用程序验证Azure AD(auth 2.0)WebAPI,oauth-2.0,azure-active-directory,msal,Oauth 2.0,Azure Active Directory,Msal,我们正在使用.NETCore3.1上的WPF创建一个桌面应用程序 我正在尝试通过Azure AD Authenticaton连接到一个web api,例如以下内容。但是,示例项目(工作正常)是用.NET Framework上的WPF编写的 有一个客户机部分和一个服务器(WebAPI)-部分。由于客户端是桌面应用程序,您应该使用回复url向(Azure-->AD-->应用程序注册…)注册api部件“” 我使用初始化PublicClientApplicationBuilder var app = P

我们正在使用.NETCore3.1上的WPF创建一个桌面应用程序

我正在尝试通过Azure AD Authenticaton连接到一个web api,例如以下内容。但是,示例项目(工作正常)是用.NET Framework上的WPF编写的

有一个客户机部分和一个服务器(WebAPI)-部分。由于客户端是桌面应用程序,您应该使用回复url向(Azure-->AD-->应用程序注册…)注册api部件“”

我使用初始化PublicClientApplicationBuilder

var app = PublicClientApplicationBuilder
        .Create(ClientIdPorterApplication)
        .WithAuthority(authority) 
        .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
        .Build();     
运行app.AcquireTokenInteractive(…)时,会收到错误消息:

仅支持环回重定向uri,但 是 建立在过程中配置或同时配置两者 应用程序注册和创建PublicClientApplication的时间 对象有关详细信息,请参阅

(该地址在示例中使用效果很好,但同样,它写在.NET FW上)

因此,为了好玩,我将replyUrl(在上面的初始化和Azure门户应用程序注册中)更改为“”。用户在选择帐户后,在web浏览器中获得“选择帐户”对话框myname@mycompany.com将显示以下消息:

身份验证完成。您可以返回应用程序。请随意 关闭此浏览器选项卡

是的!,对吧?…不太对。在代码中,我仍然得到异常,并显示错误消息:

{“配置问题正在阻止身份验证-请检查错误 有关详细信息,请发送服务器消息。您可以修改配置 在应用程序注册门户中。请参阅 详细信息,原件 例外:AADSTS7000218:请求正文必须包含以下内容 参数:“客户端\u断言”或“客户端\u机密”。\r\n ACE ID: 7b0f6384-64eb-422c-a996-CADA52F1F00\r\n相关ID: 0c579b5b-e706-4625-96da-fbf03e5a21f9\r\n时间戳:2020-04-23 12:14:59Z“}

有什么线索吗?我在谷歌上疯狂地读到,这在WPF on.net核心场景中是不可能的。我相信这一定是个解决办法

编辑: 在我的最后一个浏览器窗口中(带有消息“Authentication complete…”),url窗口中的url有一个qstring参数代码=
明天我只能接受我自己的答案,如果我忘记了,这就是答案

这就是我的工作原理: 仅为娱乐而设的设置是最佳选择:

var app = PublicClientApplicationBuilder
            .Create(ClientIdPorterApplication)                                              
            .WithAuthority(authority)
            .WithRedirectUri("http://localhost:1234")
            .Build();
(可以是任何端口,但不得由任何其他端口使用)。

msal将侦听此端口并以神奇的方式从浏览器中获取令牌

在azure中有两个应用程序注册,客户端(我的桌面应用程序)和服务器(web api)

  • 服务员:只需按照原始问题中的指南操作即可
  • 客户(加指南): 对于(Azure门户->AAD-->应用程序注册页->身份验证):
    • “将应用程序视为公共客户端。”应为“是”
    • [添加平台]->移动和桌面,在此处添加您的回复url(我的是 (上图)

您能否共享所有回复URL(及其平台)你在AAD中为此应用程序配置了什么?这是一个桌面应用程序,所以我的原始问题中只使用了回复URL Iv。你是指它们在清单文件中的外观吗?我不知道如何响应桌面应用程序上的任何回调。只是为了好玩,我在启动时还在than端口上旋转了一个TcpListener,但得到了一个“文件已在使用中”-错误我相信您自己的答案是正确的。我只是想确保您将平台设置为桌面而不是Web。即使您的回复url是http,但在您的情况下,平台必须是桌面
result = await app.AcquireTokenInteractive(scopes) 
                                        .WithAuthority(authority) 
                                        .ExecuteAsync()
                                        .ConfigureAwait(false);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);