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

时间:2019-04-17 21:27:02

标签: wpf azure authentication azure-ad-b2c azure-app-service-envrmnt

此刻,我很想在我正在研究的项目中实施身份验证。该项目的最终目标是在Azure上托管两个WPF应用程序和基于Web的应用程序。一个WPF应用程序供管理员使用,另一个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" };

1 个答案:

答案 0 :(得分:1)

如果客户端的权限设置为<option value="EUR"> <Translate contentKey="globsApp.Currency.EUR" /> </option> ,则应用程序服务中的发行者URL必须引用该权限的元数据;即https://{your-tenant-name}.b2clogin.com/tfp/{your-tenant-name}.onmicrosoft.com/{your-policy-name}/