/ / Xamarin Microsoft.Identity.Client AuthenticationResult AccessToken має значення null - xamarin, xamarin.forms, azure-active-directory, azure-ad-b2c, msal

Xamarin Microsoft.Identity.Client AuthenticationResult AccessToken є нульовим - xamarin, xamarin.forms, azure-active-directory, azure-ad-b2c, msal

Я створюю програму PCL Xamarin.Forms, яка використовує Azure B2C для автентифікації користувачів. Раніше я використовував Microsoft.Identity.Client версія 1.0.304142221-alpha, але я щойно оновився до 1.1.0-preview після того, як він вийшов на NuGet.

Я також використовую Azure MobileServiceClient для входу користувачів, щоб лише автентифіковані користувачі могли дзвонити на мої таблиці.

Я можу успішно пройти автентифікацію, яку встановив як цей зразок на 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: Мої налаштування API Azure B2C

Для мого власного клієнта: Налаштування мого власного клієнта 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, тому я все ще не можу здійснювати дзвінки до таблиць.

Відповіді:

1 для відповіді № 1

Я намагаюся перевірити цю проблему за допомогою Microsoft.Identity.Client версія 1.1.0-попередній перегляд, проте для мене це добре працює.

Мобільний додаток було захищено за допомогою програми Azure AD B2C за допомогою Розширений і встановіть ДОЗВОЛЕНІ ЗНАЧЕНІ АУДИТОРІЇ за допомогою ідентифікатора програми, як показано на малюнку нижче: введіть опис зображення тут

Після цього я використав MobileServiceClient від SDK для мобільних клієнтів Azure. І до нового MobileServiceClient нам потрібно лише вказати URL-адресу мобільного додатка як код нижче:

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

Однак якщо я використав MobileServiceClient від SDK для мобільних служб Azure , Я можу відтворити те саме питання з 401 помилка. У цьому сценарії, коли нам потрібно додати .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();