Я створюю програму 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:
У своєму додатку я входжу так:
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();