0

我正在创建一个使用 Azure B2C 对用户进行身份验证的 Xamarin.Forms PCL 应用程序。我之前使用的是Microsoft.Identity.Client1.0.304142221-alpha 版本,但在 NuGet 上发布后我刚刚更新到 1.1.0-preview。

我还使用 AzureMobileServiceClient登录用户,因此只有经过身份验证的用户才能调用我的表。

我能够成功进行身份验证,我在 GitHub 上设置了这个示例。

使用以前的版本Microsoft.Identity.Client,我能够MobileServiceClient像这样登录:

AuthenticationResult ar = await App.AuthenticationClient.AcquireTokenAsync(Config.Scopes, 
         string.Empty, UiOptions.SelectAccount, string.Empty, null, 
         Config.Authority, Config.SignUpSignInpolicy);

JObject payload = getPayload(ar.IdToken);
payload["access_token"] = ar.Token;
string objectId = payload["oid"].ToString();

MobileServiceUser u = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory,
                      payload);

但是,更新后,AuthenticationResult不再有一个名为Token. 相反,它有AccessToken,对我来说,总是返回null

MobileServiceClient我尝试使用登录IdToken,但这会产生未经授权的错误。

我认为这个问题可能与我定义的范围有关。现在我有:

public static string[] Scopes = { "https://<MyTennant>/<MyAPIName>.read"};

是否有任何我缺少的范围来获得AccessToken或者是其他地方的问题?

更新:这是我在 Azure 门户中 为我的 API 设置的设置: 我的 Azure B2C API 设置

对于我的本地客户端: 我的 Azure B2C 本机客户端设置

在我的应用程序中,我是这样登录的:

AuthenticationResult ar = await App.AuthenticationClient.AcquireTokenAsync(Scopes, 
                     GetUserByPolicy(App.AuthenticationClient.Users, PolicySignUpSignIn),
                     App.UiParent);
payload = getPayload(ar.IdToken);
payload["access_token"] = ar.IdToken;

var mobileService = new Microsoft.WindowsAzure.MobileServices.MobileServiceClient("https://giftthis.azurewebsites.net/.auth/");
MobileServiceUser u = await mobileService.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, payload);

LoginAsync现在正在执行,但它返回 null 所以我仍然无法调用表。

4

1 回答 1

1

我正在尝试使用Microsoft.Identity.Client1.1.0-preview 版本来测试这个问题,但它对我来说效果很好。

移动应用程序使用具有高级模式的Azure AD B2C 应用程序进行保护,并使用应用程序 ID 设置ALLOWED TOKEN AUDIENCES ,如下图所示:在此处输入图像描述

之后,我使用了MobileServiceClientAzure Mobile Client SDK。而对于新的,MobileServiceClient我们只需要提供移动应用程序 URL,如下代码:

string applicationUrl = "https://mobilefei.azurewebsites.net/";
var mobileClient = new MobileServiceClient(applicationUrl);

但是,如果我使用MobileServiceClientAzure Mobile Services SDK中的401错误 ,我可以重现相同的问题。在这种情况下,当我们需要 append.auth来初始化MobileServiceClient类似下面的代码时:

string applicationUrl = "https://mobilefei.azurewebsites.net/.auth/";
var mobileClient = new MobileServiceClient(applicationUrl);

更新:

string CLIENT_ID = "420a3a24-97cf-46ca-a882-f6c047b0d845";
string[] SCOPES = { "https://xxx.onmicrosoft.com/b2cwebapp/read" };
string Tenant = "xxx.onmicrosoft.com";

string PolicySignUpSignIn = "B2C_1_Sign_In";
string AuthorityBase = $"https://login.microsoftonline.com/tfp/{Tenant}/";
string Authority = $"{AuthorityBase}{PolicySignUpSignIn}";


PublicClientApplication myApp = new PublicClientApplication(CLIENT_ID, Authority);

AuthenticationResult authenticationResult = myApp.AcquireTokenAsync(SCOPES).Result;

Console.WriteLine($"AccessToken:\n{authenticationResult.AccessToken}");

Console.WriteLine($"IdToken:\n{authenticationResult.IdToken}");

//This applicationUrl  works for WindowsAzure.MobileServices
//string applicationUrl = "https://mobilefei.azurewebsites.net/.auth/";

//This applicationUrl  works for Microsoft.Azure.Mobile.Client
string applicationUrl = "https://mobilefei.azurewebsites.net/";
var mobileClient = new MobileServiceClient(applicationUrl);

JObject token = new JObject();
token.Add("access_token", authenticationResult.IdToken);
var user = mobileClient.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory, token).Result;
Console.WriteLine($"UserID:\n{user.UserId}");
Console.Read();
于 2017-06-12T09:36:12.583 回答