首页 > 解决方案 > 从 .NET Core 上的 WPF 桌面应用对 Azure AD (auth 2.0) WebAPI 进行身份验证

问题描述

我们正在.NET Core 3.1 上使用 WPF 创建桌面应用程序。

我正在尝试使用 Azure AD Authenticaton 连接到 Web api,例如遵循本指南。但是,示例项目(可以正常工作)是用 .NET Framework 上的 WPF 编写的。

有一个客户端部分和一个服务器(web api)部分。由于客户端是桌面应用程序,您应该使用 (Azure-->AD--> app registrations... ) 注册 api-part,回复 url 为“ https://login.microsoftonline.com/common/oauth2/nativeclient "

我初始化我的 PublicClientApplicationBuilder

var app = PublicClientApplicationBuilder
        .Create(ClientIdPorterApplication)
        .WithAuthority(authority) 
        .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
        .Build();     

并在运行 app.AcquireTokenInteractive(...) 时收到错误消息:

仅支持环回重定向 uri,但 找到了https://login.microsoftonline.com/common/oauth2/nativeclient。在应用注册期间和创建 PublicClientApplication 对象时配置http://localhosthttp://localhost:port 。有关详细信息,请参阅https://aka.ms/msal-net-os-browser

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

所以,只是为了好玩,我将replyUrl(在上面的初始化和Azure Portal App注册中)更改为“ http://localhost:1234 ”。用户在网络浏览器中获得“选择帐户”对话框,在选择帐户 myname@mycompany.com 后,将显示以下消息:

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

是的!,对吧?...不完全是。在代码中,我仍然收到带有错误消息的异常:

{“配置问题阻止身份验证 - 请查看服务器的错误消息以获取详细信息。您可以在应用程序注册门户中修改配置。有关详细信息,请参阅 https://aka.ms/msal-net-invalid-client。原文异常:AADSTS7000218:请求正文必须包含以下参数:“client_assertion”或“client_secret”。\r\n跟踪 ID:7b0f6384-64eb-422c-a996-cadaa52f1f00\r\n相关 ID:0c579b5b-e706-4625-96da- fbf03e5a21f9\r\n时间戳:2020-04-23 12:14:59Z"}

有什么线索吗?我在谷歌搜索的狂热中读到,这在 .net core-scenario 上的 WPF 上是不可能的。我确定必须是一个解决方案

编辑: 在我的最终浏览器窗口中(带有消息“身份验证完成...”,url-window 中的 url 有一个 qstring 参数 code= 在此处输入图像描述

标签: oauth-2.0azure-active-directorymsal

解决方案


明天只能接受自己的答案,如果忘记了,这就是答案

这对我有用:只是为了有趣的设置是要走的路:

var app = PublicClientApplicationBuilder
            .Create(ClientIdPorterApplication)                                              
            .WithAuthority(authority)
            .WithRedirectUri("http://localhost:1234")
            .Build();

(可以是任何端口,但不得被任何其他端口使用)。...

result = await app.AcquireTokenInteractive(scopes) 
                                        .WithAuthority(authority) 
                                        .ExecuteAsync()
                                        .ConfigureAwait(false);
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

msal会监听这个端口并以神奇的方式从浏览器获取token

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

  • 服务器:只需按照原始问题中的指南进行操作
  • 客户端(加指南):对于(Azure Portal->AAD-->App reg-page->Authentication:
    • “将应用程序视为公共客户端。” 应该是“是”
    • [添加平台] ->手机和桌面,在此处添加您的回复网址(我的是 上面的http://localhost:1234

推荐阅读