2017-02-22 7 views
6

Я хочу получить токен из ADAL для аутентификации определенного вызова сервера.Как я могу получить токен от ADAL в Xamarin.iOS?

Я попытался использовать этот код:

var authorityUrl = string.Format(@"https://login.microsoftonline.com/{0}/oauth2/token", AadInstance); 
var context = new AuthenticationContext(authorityUrl); 
var credential = new ClientCredential(ClientId, ClientSecret); 
var authenticationResult = context.AcquireTokenAsync(RemoteClientId, credential).Result; 
return authenticationResult.AccessToken; 

Но я получаю это в журналах:

AcquireTokenHandlerBase.cs: === Token Acquisition started: 
    Authority: https://login.microsoftonline.com/f9e55202-63c0-4821-9fc7-e38eb5bc3a08/oauth2/token/ 
    Resource: 80d147c1-0b9a-48e0-8a62-1dc82890e98e 
    ClientId: cab18d6f-3edc-446b-a071-45b28b192f0b 
    CacheType: null 
    Authentication Target: Client 

TokenCache.cs: Looking up cache for a token... 
TokenCache.cs: No matching token was found in the cache 
AcquireTokenHandlerBase.cs: System.NullReferenceException: Object reference not set to an instance of an object 
    at Microsoft.IdentityModel.Clients.ActiveDirectory.BrokerHelper.get_CanInvokeBroker() [0x0000c] in <f671779d8b3b49399b31bf519785e86e>:0 
    at Microsoft.IdentityModel.Clients.ActiveDirectory.AcquireTokenHandlerBase+<RunAsync>d__55.MoveNext() [0x00389] in <e4081d9da4634689910019c82c03f3e7>:0 

Я понятия не имею, что может быть не так с этим, так как это же код работает как и ожидалось в приложении для Android, в то время как он не работает в версии iOS.

+0

Вы используете самую последнюю версию Адал? –

+0

@ FeiXue-MSFT да, я использую версию 3.13.8.999 – vrwim

ответ

0

В коде есть несколько забавных вещей. Прежде всего, приложения iOS и Android являются публичными клиентами и, следовательно, не могут надлежащим образом защитить секрет клиента. Вы никогда не должны хранить секрет клиента в своем приложении. Таким образом, поток учетных данных клиента не предназначен или не подходит для этого сценария, а скорее проверка подлинности сервера на сервер. Это может быть основной причиной вашей ошибки.

Here's a great sample как создать приложение Xamarin с использованием ADAL для всех Android, iOS, Win Desktop, Windows Universal. Я настоятельно рекомендую следовать приведенному здесь шаблону.

+0

То есть библиотека, которую я использую. Я недостаточно знаю Active Directory, чтобы правильно указать, что можно/нужно сделать для аутентификации вызова. Кроме того, серверный сервер не реализован нами, поэтому мы не можем легко его изменить. Я закончил выполнение вызова вручную. – vrwim

-1

я в конечном итоге, реализующей себя называют:

public async Task<string> GetADALToken(string aadInstance, string clientId, string clientSecret, string remoteClientId) 
{ 
    string body = $"resource={remoteClientId}&client_id={clientId}&client_secret={clientSecret}&grant_type=client_credentials"; 
    HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, $"https://login.microsoftonline.com/{aadInstance}/oauth2/token"); 

    byte[] byteArray = Encoding.UTF8.GetBytes(body); 
    var content = new ByteArrayContent(byteArray); 
    // set content type 
    content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 
    message.Content = content; 

    message.Headers.Add("Accept", "application/json"); 

    HttpResponseMessage result = null; 
    try 
    { 
     result = await _adalClient.SendAsync(message); 
     result.EnsureSuccessStatusCode(); 
     var v = await result.Content.ReadAsStringAsync(); 
     return v; 
    } 
    catch (HttpRequestException reqExecption) 
    { 
     Log(reqExecption); 
     if (result != null) 
     { 
      return "error " + await result.Content.ReadAsStringAsync(); 
     } 
     return "error " + reqExecption.Message; 
    } 
    catch (Exception ex) 
    { 
     Log(ex); 
     return "error " + ex.Message; 
    } 
}