0

OK, daher erstelle ich ein neues Projekt in VS2017 für eine ASP.Net Core 2.0-API. Ich habe und Azure AD eingerichtet und auf den Assistenten, um ein neues Projekt einzurichten, wähle ich Authentifizierung ändern und "Work or School accont" und geben Sie den Namen meiner Azure AD (d. H. Mycompany.onmicrosoft.com). Das Projekt wird erstellt und ich kann die Zugabe dieser Code in der Startup.csSo konfigurieren Sie eine ASP.Net Core 2.0-API für die Verwendung von Azure AD als Identitätsanbieter

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddAuthentication(sharedOptions => 
     { 
      sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 
     }) 
     .AddAzureAdBearer(options => Configuration.Bind("AzureAd", options)); 

     services.AddMvc(); 
    } 

und ich kann die Einstellungen hinzugefügt, um die Datei appSettings.json

"AzureAd": { 
    "Instance": "https://login.microsoftonline.com/", 
    "Domain": "mycompany.onmicrosoft.com", 
    "TenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 
    "ClientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" 
}, 

Wo TenentID ist das Verzeichnis sehen Die ID für Azure AD und ClientID ist der ApplicationID-Wert der neu erstellten API, da sie jetzt in Azure AD registriert ist.

Das macht alles Sinn.

Aber wenn ich das Projekt in VS2017 laufen lasse und dann zur https://localhost:44348/api/values Position navigiere, bekomme ich einen 401 Unauthorized.

Der Teil fehlt mir, dass ich meine https://localhost:44348 Browser-Instanz irgendwie in Azure registrieren muss, um es als die zugelassene Client-Anwendung für meine Tests zu identifizieren. Aber ich weiß nicht, wo ich das machen soll. Registrieren Sie einfach https://localhost:44348 in der App-Registrierung für meine Azure AD woran soll ich einen Schlüssel in der App-Registrierung für das API-Projekt Anew in Azure AD generieren und diesen Schlüssel irgendwie als Geheimnis in meinem Auth-Header übergeben?

Was, wenn ich das mit Postman testen wollte? Wie würde ich das tun? Muss ich den Postboten irgendwie in Azure AD registrieren?

Ich habe mir viele Google-Seiten angeschaut und es gibt viele Beispiele, die zeigen, wie man sich von Webseiten aus interaktiv anmeldet und dann die Anmeldungs-URL der Webseite in Azure AD registriert, aber nicht wie man es einfach testet eine API von VS2017 Debug oder Postman.

Wie mache ich das?

BEARBEITEN - Nach dem Lesen der Kommentare habe ich eine Konsolenanwendung erstellt und diese in meinen Azure AD App-Registrierungen registriert und einen Schlüssel erstellt. Ich stelle es hier für jeden anderen zur Verfügung, der versucht, diesen Prozessserver zum Server OAUTH2-Prozess zu verstehen.

Guthaben auf this GitHub Repo für Hilfe im Code-Design; Hier

ist die Konsole Anwendungscode

using Microsoft.IdentityModel.Clients.ActiveDirectory; 
using System; 
using System.Configuration; 
using System.Globalization; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Web.Script.Serialization; 

namespace API.TestConsole 
{ 
    class Program 
    { 

     /// <summary> 
     /// The AAD Instance is the instance of Azure. 
     /// </summary> 
     /// <remarks> 
     /// Example: https://login.microsoftonline.com/{0} 
     /// </remarks> 
     private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; 

     /// <summary> 
     // The Tenant is the Directory ID of the Azure AD tenant in which this application is registered. 
     /// </summary> 
     private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"]; 

     /// <summary> 
     /// The Client ID is used by this application to uniquely identify itself to Azure AD. 
     /// </summary> 
     /// <remarks> 
     /// This value is obtained when this application is registered in Azure AD 
     /// </remarks> 
     private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; 

     /// <summary> 
     // The App Key is a credential used by this application to authenticate to Azure AD. 
     /// </summary> 
     /// <remarks> 
     /// This value is generated when this application is registered in Azure AD and assigned a key 
     /// </remarks> 
     private static string appKey = ConfigurationManager.AppSettings["ida:AppKey"]; 

     /// <summary> 
     // The Authority is the sign-in URL of the tenant. 
     /// </summary> 
     /// <remarks> 
     /// This is a string combination of the aadInstance and the tenant 
     /// </remarks> 
     static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant); 

     /// <summary> 
     /// The ApplicationID of the evsApi service in Azure 
     /// </summary> 
     private static string apiResourceId = ConfigurationManager.AppSettings["api:ApiResourceId"]; 

     /// <summary> 
     /// The base URL address of the Api service 
     /// </summary> 
     private static string apiBaseAddress = ConfigurationManager.AppSettings["api:ApiBaseAddress"]; 


     private static HttpClient httpClient = new HttpClient(); 
     private static AuthenticationContext authContext = null; 
     private static ClientCredential clientCredential = null; 

     static void Main(string[] args) 
     { 

      // As a test, call the test Api, values endpoint 10 times with a short delay between calls 
      authContext = new AuthenticationContext(authority); 
      clientCredential = new ClientCredential(clientId, appKey); 

      for (int i = 0; i < 10; i++) 
      { 
       Thread.Sleep(3000); 
       GetValues().Wait(); 
      } 
      Console.WriteLine("Press ENTER to exit."); 
      Console.ReadLine(); 
     } 

     static async Task GetValues() 
     { 
      // Get an access token from Azure AD using client credentials. 
      // If the attempt to get a token fails because the server is unavailable, retry twice after 3 seconds each. 
      AuthenticationResult result = null; 
      int retryCount = 0; 
      bool retry = false; 

      do 
      { 
       retry = false; 
       try 
       { 
        // ADAL includes an in memory cache, so this call will only send a message to the server if the cached token is expired. 
        result = await authContext.AcquireTokenAsync(apiResourceId, clientCredential); 
       } 
       catch (AdalException ex) 
       { 
        if (ex.ErrorCode == "temporarily_unavailable") 
        { 
         retry = true; 
         retryCount++; 
         Thread.Sleep(3000); 
        } 

        Console.WriteLine(
         String.Format($"An error occurred while acquiring a token\nTime: " + 
         $"{DateTime.Now.ToString()}\nError: {ex.ToString()}\nRetry: {retry.ToString()}\n")); 
       } 

      } while ((retry == true) && (retryCount < 3)); 

      if (result == null) 
      { 
       Console.WriteLine("Canceling attempt to contact the test API service.\n"); 
       return; 
      } 

      // Add the access token to the authorization header of the request. 
      httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); 

      // Call the values endpoint in the test API service. This is an HTTP GET. 
      Console.WriteLine("Retrieving values from Values endpoint at {0}", DateTime.Now.ToString()); 
      HttpResponseMessage response = await httpClient.GetAsync(apiBaseAddress + "/api/values"); 

      if (response.IsSuccessStatusCode) 
      { 
       // Read the response and output it to the console. 
       string s = await response.Content.ReadAsStringAsync(); 
       Console.WriteLine($"Values Result: {s}\n"); 
      } 
      else 
      { 
       Console.WriteLine("Failed to retrieve Values\nError: {0}\n", response.ReasonPhrase); 
      } 
     } 

    } 
} 

Und hier ist der App.Config

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" /> 
    </startup> 
    <appSettings> 
    <add key="ida:AADInstance" value="https://login.microsoftonline.com/{0}" /> 

    <!-- This is the Directory ID value of the Azure AD --> 
    <add key="ida:Tenant" value="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /> 

    <!-- This is the Application ID value of this test console application as it is 
     registered in the Azure AD app registration in the portal directory -->  
    <add key="ida:ClientId" value="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /> 

    <!-- This is the Key value of this test console application, as it is 
     generated in the keys section for "Test Console Key" in the Azure AD app registration 
     for this test console application in the portal directory --> 
    <add key="ida:AppKey" value="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /> 

    <!-- This is the Application ID value of the test api application as it is 
     registered in the Azure AD app registration in the portal directory --> 
    <add key="api:apiResourceId" value="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /> 

    <!-- This is the custom domain URL assigned to the test app service in the Azure 
     portal --> 
    <add key="api:apiBaseAddress" value="https://testapi.mycompany.com" /> 
    </appSettings> 

</configuration> 
+0

Einfach gesagt, Sie benötigen ein Zugriffs-Token. Wie erhalten Sie ein Zugriffs-Token? Durch einen Authentifizierungsablauf wie Client-Anmeldeinformationen: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service. Oder Sie müssen möglicherweise OpenID Connect verwenden: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-openid-connect-code. Clientanmeldeinformationen machen den Anruf als App, während OIDC die API als Benutzer aufrufen kann. – juunas

+0

Sie müssen als Benutzer aufrufen, es sei denn, Sie fügen einige Berechtigungen hinzu: https://joonasw.net/view/defining-permissions-and-roles-in-aad – juunas

+0

Wie auch immer, Sie müssen die App registrieren, die den Aufruf der API, und geben Sie ihm Zugriff auf die API. – juunas

Antwort

1

Vereinfacht gesagt, Sie benötigen ein Zugriffstoken.

Wie erhalten Sie ein Zugriffs-Token? Durch einen Authentifizierungsablauf wie OAuth Client Credentials: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service. Sie können OpenID Connect: https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-openid-connect-code verwenden.

Client-Anmeldeinformationen werden den Anruf als eine App, während OIDC (und einige andere Flows) können Sie die API als Benutzer aufrufen.

Sie müssen als Benutzer anrufen, wenn Sie einige Berechtigungen hinzu: https://joonasw.net/view/defining-permissions-and-roles-in-aad

Wie auch immer, werden Sie die App registrieren, die die API aufrufen, und es Zugriff auf die API geben.

Verwandte Themen