как правильно реализовать Microsoft.IdentityModel.Clients.ActiveDirectory в xamarin 4 - PullRequest
0 голосов
/ 19 июня 2019

После установки пакета nuget Microsoft.IdentityModel.Clients.ActiveDirectory

Я пытаюсь получить токен через

  string cloud = "https://login.microsoftonline.com/common/oauth2";
                    string tenantId = App.tenantId;
                    string authority = $"{cloud}/{tenantId}";

                    //
                    string clientId = App.clientId;
                    Uri redirectUri = App.redirectUrl;


                    string resource = clientId;


                     AuthenticationResult authResult = null;
                     AuthenticationContext authContext = new AuthenticationContext(authority);

                    try
                    {

                    if (authContext.TokenCache.ReadItems().Count() > 0)
                        {
                            authContext = new AuthenticationContext(authContext.TokenCache.ReadItems().First().Authority);
                            authResult = await authContext.AcquireTokenSilentAsync(resource, clientId);
                        }
                        else
                        {
                            authResult = await authContext.AcquireTokenAsync(resource, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto));
                        }


                    }
                    catch (AdalSilentTokenAcquisitionException ee)
                    {
                        authResult = await authContext.AcquireTokenAsync(resource,clientId,  redirectUri,null);
                    }

Когда я пытаюсь собрать, я получаюследующие ошибки

не могут преобразовать из «Microsoft.IdentityModel.Clients.ActiveDirectory.PromptBehavior» в «Android.App.Activity»

не могут преобразовать из «Microsoft.IdentityModel.Clients.ActiveDirectory».PromptBehavior 'to' UIKit.UIViewController '

строка, вызывающая эту строку, которая вызывает ошибку

                                authResult = await authContext.AcquireTokenAsync(resource, clientId, redirectUri, new PlatformParameters(PromptBehavior.Auto));

как мне решить эту проблему?

  1. Версия Xamarin - 4.0.0.482894
  2. Microsoft.IdentityModel.Clients.ActiveDirectory версия 5.1.0
  3. Visual studio 2017

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

В вашем общем проекте используйте IPlatformParameter, что-то вроде этого:

 public class AuthenticationManager
    {
        private static string _authority;
        private static string _resource;
        private static string _clientId;
        private static string _returnUri;
        private static IPlatformParameters _parameters;
        private string _accessToken;

        public static UserInfo UserInfo { get; private set; }

        public static void SetConfiguration(string authority, string resource, string clientId, string returnUri)
        {
            _authority = authority;
            _resource = resource;
            _clientId = clientId;
            _returnUri = returnUri;

            var authContext = new AuthenticationContext(_authority);
            authContext.TokenCache.Clear();
        }

    public static void SetParameters(IPlatformParameters parameters)
    {
        _parameters = parameters;
    }

        public async Task<bool> LoginAsync()
        {
            _accessToken = await GetAccessTokenAsync();
            return true;
        }

        public Task LogoutAsync()
        {
            var authContext = new AuthenticationContext(_authority);
            var cachedToken = authContext.TokenCache.ReadItems().FirstOrDefault(t => t.Authority == _authority && t.ClientId == _clientId && t.Resource == _resource);

            if (cachedToken != null)
            {
                authContext.TokenCache.DeleteItem(cachedToken);
            }

            UserInfo = null;
            _accessToken = null;

            return Task.CompletedTask;
        }



        private async Task<string> GetAccessTokenAsync()
        {
            var uri = new Uri(_returnUri);

            var authContext = new AuthenticationContext(_authority);
            var authResult = await authContext.AcquireTokenAsync(_resource, _clientId, uri, _parameters);

            UserInfo = authResult.UserInfo;

            return authResult.AccessToken;
        }
    }

Затем в конкретной платформе вызовите SetParameters метод: Пример в Android на вашем MainActivity.cs:

protected override void OnCreate(Bundle bundle)
     {
         var platformParameters = new PlatformParameters(this);
         AuthenticationManager.SetParameters(platformParameters);
     }

Аналогично в iOS:

 public override void ViewDidLoad()
     {
         var platformParameters = new PlatformParameters(this);
         AuthenticationManager.SetParameters(platformParameters);
     }
2 голосов
/ 20 июня 2019

Вам нужно привести его к Activity

new PlatformParameters((Activity) PromptBehavior.Auto));
...