如何使用 AAD B2C 对 WPF 应用程序进行身份验证以获取对 Azure 应用服务的访问权限

How to Authenticate WPF Application with AAD B2C to gain access to Azure App Service

我现在完全无法尝试在我正在处理的项目中实施身份验证。该项目的最终目标是在 Azure 上托管两个 WPF 应用程序和一个基于 Web 的应用程序。一个 WPF 应用程序供管理员使用,另一个供员工使用,最后一个 Web 应用程序供客户使用。每个应用程序都将连接到一个共享数据库的 Azure 应用服务,并且需要进行身份验证,以便将所有用户分开。对于身份验证,我计划使用 Azure Active Directory B2C。

几天来,我一直在研究并尝试在一个 WPF 应用程序上实现这一点,但正如我之前所说,我完全陷入困境。据我了解,为 WPF 进行 B2C 身份验证的唯一方法是通过客户端管理的身份验证。按照 Azure 教程网站、其他 SO 帖子和 Azure Git Repos 上显示的代码,我得出了以下代码:

   System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
   authResult = await App.PublicClientApp.AcquireTokenAsync(App.ApiScopes,
       GetUserByPolicy(accounts, App.PolicySignUpSignIn), UIBehavior.SelectAccount, 
       string.Empty, null, App.Authority);
   Newtonsoft.Json.Linq.JObject payload = new Newtonsoft.Json.Linq.JObject();
   payload["access_token"] = authResult.AccessToken;
   MobileServiceClient msclient = new MobileServiceClient(App.AzureAppService);
   MobileServiceUser user = await msclient.LoginAsync(
        MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);

一切顺利开始,我能够显示我的登录政策。登录后,我获得了一个 IdToken 和一个 AccessToken。创建 JObject 并向其添加访问令牌后,我尝试使用它通过我的 MobileServiceClient 登录。但这就是我遇到问题的地方。无论我做什么,无论我尝试什么,我都只会收到 401 错误的异常,告诉我我未经授权。这也是我这几天一直在纠结的点。

显然,我在这里没有做任何特别的事情,我想很多人在我之前已经做过,但我似乎无法超越这一点,希望有人能够为我提供一些指导。我偏离轨道了吗?有没有更好的方法可以做到这一点?任何建议或意见将不胜感激,因为我是 Azure 的新手。

谢谢大家!

更新:

我的 Azure 设置如下:

在应用服务端

Client Id: "{Client Id of the AAD B2C App}"
Issuer URL: "login.microsoft.com{TennatName}.onmicrosoft.com/v2.0/.well-known/openid-configuration"
Allowed Token Audiences: "https://{App Service Name}.azurewebsites.net" (App Service URL)

B2C 端:

Web and native client enabled
Web Reply URL: "https://{AppServiceName}.azurewebsites.net/.auth/login/add/callback"
Native App: I did not know what custom redirect URL to have so I have both
"{TennatName}.onmicrosoft.com://auth/" and 
"{AppServiceName}.azurewebsites.net/.auth/login/add/callback"

更新二:

My authority is login.microsoftonline.com/tfp{tenant}/{policy}/oauth2/v2.0/authorize
And my ApiScopes = { "https://{Tenant}/thisisatest/user_impersonation" };

如果客户端的权限设置为https://{your-tenant-name}.b2clogin.com/tfp/{your-tenant-name}.onmicrosoft.com/{your-policy-name}/,那么应用服务中的颁发者URL必须引用该权限的元数据;即 https://{your-tenant-name}.b2clogin.com/tfp/{your-tenant-name}.onmicrosoft.com/{your-policy-name}/v2.0/.well-known/openid-configuration.