首页 > 解决方案 > 如何使用 AAD B2C 对 WPF 应用程序进行身份验证以访问 Azure 应用服务

问题描述

目前,我很难在我正在从事的项目中实施身份验证。该项目的最终目标是在 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"

更新 2:

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

标签: wpfazureauthenticationazure-ad-b2cazure-app-service-envrmnt

解决方案


如果客户端的权限设置为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


推荐阅读