【问题标题】:Authentication to a Azure AD (auth 2.0) WebAPI from WPF-desktop app on .NET Core从 .NET Core 上的 WPF 桌面应用对 Azure AD (auth 2.0) WebAPI 进行身份验证
【发布时间】:2020-04-27 04:19:44
【问题描述】:

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

我正在尝试使用 Azure AD Authenticaton 连接到 Web api,例如 this guide。但是,示例项目(可以正常工作)是用 .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 是 成立。期间配置http://localhosthttp://localhost:port 应用注册以及创建 PublicClientApplication 时 目的。详情见https://aka.ms/msal-net-os-browser

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

所以,为了好玩,我将 replyUrl(在上面的初始化和 Azure 门户应用注册中)更改为“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=

【问题讨论】:

  • 您能否分享您在 AAD 中为此应用配置的所有回复网址(及其平台)?
  • 这是一个桌面应用程序,所以我使用的唯一回复网址在我原来的问题中。您是指它们在清单文件中的外观吗?我看不到如何响应桌面应用程序上的任何回调。只是为了好玩,我还在启动时在端口上启动了一个 TcpListener,但得到一个“文件已在使用中”-错误
  • 我相信你自己的答案是正确的。我只是想确保您将平台设置为桌面而不是 Web。即使您的回复 url 是 http,但在您的情况下,平台必须是桌面

标签: oauth-2.0 azure-active-directory msal


【解决方案1】:

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

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

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 以上)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    相关资源
    最近更新 更多