Oauth 2.0 从.NET Core上的WPF桌面应用程序验证Azure AD(auth 2.0)WebAPI
我们正在使用.NETCore3.1上的WPF创建一个桌面应用程序 我正在尝试通过Azure AD Authenticaton连接到一个web api,例如以下内容。但是,示例项目(工作正常)是用.NET Framework上的WPF编写的 有一个客户机部分和一个服务器(WebAPI)-部分。由于客户端是桌面应用程序,您应该使用回复url向(Azure-->AD-->应用程序注册…)注册api部件“” 我使用初始化PublicClientApplicationBuilderOauth 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
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(我的是 (上图)
result = await app.AcquireTokenInteractive(scopes)
.WithAuthority(authority)
.ExecuteAsync()
.ConfigureAwait(false);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);