5

ottengo due SID diverso per lo stesso utente quando l'utente accede attraverso un'Azure Web App (ASP.NET MVC) e Xamarin.iOS appAzure Mobile Service e Azure Web App autenticazione

Setup

Azure WebApp ASP.NET 5 con controller API

Xamarin iOS App con Microsoft.WindowsAzure.Mobile.Client SDK Azure B2C AAD

utente sul Web

ottengo il valore Object Identifier che è l'AAD SID:

var userClaim = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 

utente su mobile

ottengo solo un valore Nameidentifier e nessun Object Identifier

ClaimsPrincipal mobileUser = this.User as ClaimsPrincipal; 
var mobileUserClaim = mobileUser.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"); 

Il SID è completamente diverso, il SID per l'utente autenticato da Mobile ottiene SID: xxxx mentre da Web ottiene xxx

So che se si installa un'app mobile di Azure e una app Web di Azure il SID è lo stesso durante l'autenticazione. Ma non voglio gestire due siti per la dimensione (piccola) della mia app. Lo scopo dell'App è di avere un'app Web semplice per eseguire alcune azioni e le stesse azioni sul telefono, dal telefono utilizzo l'SDK di Servizio mobile di Azure e InvokeAPIAsync per utilizzare il controller API nell'app Web.

Grazie

risposta

1

Voglio chiarire la situazione. Si stanno osservando due SID:

1) Da AAD, accedendo a AAD tramite browser web.

2) Dal servizio app di Azure (app Web e app mobile), probabilmente utilizzando LoginAsync dal nostro client. Questo metodo invoca il flusso di accesso diretto dal server.

Questo è di progettazione. MobileServiceClient ottiene i token del servizio app e si autentica con la tua app mobile con quel token. È possibile scambiare il token di autenticazione che si ottiene dal servizio app di Azure per il SID AAD effettuando un GET all'endpoint .auth/me.

Dopo che il client è stato autenticato con App Service e AAD, è possibile ottenere ulteriori informazioni sull'utente AAD (o qualsiasi altro provider di identità) chiamando yoursite.azurewebsites.net/.auth/me e analizzando la risposta per il reclamo desiderato:

({"typ": "http://schemas.microsoft.com/identity/claims/objectidentifier").

Un'altra strategia potrebbe essere quella di utilizzare ADAL (http://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/) dal client app per effettuare il login con AAD, e quindi utilizzare il token di accesso DAA per ottenere un app mobile di token utilizzando il sovraccarico LoginAsync appropriata:

https://github.com/Azure/azure-mobile-apps-net-client/blob/master/src/Microsoft.WindowsAzure.MobileServices.iOS/Extensions/MobileServiceClientExtensions.cs#L55

I parametri si aggiungono dovrebbe essere in formato { "access_token": "[AAD valore access_token]"} wiki di

Brett Samblanet su .NET Server su ID utente dovrebbe aiutare a capire cosa sta succedendo: https://github.com/Azure/azure-mobile-apps-net-server/wiki/Understanding-User-Ids

+0

Grazie per aver dedicato del tempo per rispondere. Ho testato il tuo esempio con l'utilizzo del sovraccarico LoginAsync con Token, ma ho usato invece bearer o access_token. Ci sto provando stasera. Grazie – JCB

+0

Un'altra domanda: se utilizzo ADAL dal client (app iOS), posso utilizzare AAD AccessToken recuperato per autenticare l'utente contro la mia API WebApp? Ho provato questo. dove authResult.AccessToken è il token di accesso AAD tramite ADAL. Ma non sono mai riuscito ad autenticarmi contro la mia API WebApp, non autorizzato. Il parametro è sbagliato, invece di Bearer, dovrebbe forse access_token? Ci proverei stasera. Client HttpClient = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue ("Bearer", authResult.AccessToken); – JCB

+0

@JCB Ci scusiamo per il ritardo. No, il token di accesso AAD non può essere utilizzato per l'autenticazione con WebApp. È necessario scambiarlo con un token AppService. In particolare, guarda ancora l'overload di LoginAsync() che ho menzionato alla fine del mio post. Il risultato sarà un token del servizio app. – Aziel

0

finalmente ho potuto farlo funzionare:

string authority = "https://login.windows.net/[TentantId].onmicrosoft.com/"; 
      string resourceId = "[myApiClientId]"; 
      string clientId = "[clientId]"; 
      string redirectUri = "https://[URL]/.auth/login/done"; 

      AuthenticationContext ac = new AuthenticationContext(authority); 
      AuthenticationResult ar = await ac.AcquireTokenAsync(resourceId, clientId, 
       new Uri(redirectUri), new PlatformParameters(this)); 
      JObject payload = new JObject(); 
      payload["access_token"] = ar.AccessToken; 

      string authHeader = ar.CreateAuthorizationHeader(); 
      HttpClient client = new HttpClient(); 
      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "[API URL Route]"); 
      request.Headers.TryAddWithoutValidation("Authorization", authHeader); 
      HttpResponseMessage response = await client.SendAsync(request); 
      string content = await response.Content.ReadAsStringAsync(); 
Problemi correlati