2016-01-01 16 views
6

Używam API usługi Azure REST do pobierania informacji o korzystaniu z Billing Usage i Ratecard. Aby zdobyć token za pomocą AcquireToken() Metoda, początkowo użyłem tylko klienta Id, który następnie prosi o poświadczenia użytkownika w oknie logowania.Interfejs API korzystania z usługi Azure Billing zwraca 401 Nieautoryzowane

jednak szukam nieinterakcyjnym podejścia, więc użyłem poświadczeń klienta w którym przekazywane identyfikatora klienta i Client tajny klucz.

Ale daje „Remote Server zwraca błąd 401 Nieautoryzowany”

Kiedy patrzę w błąd głęboko, stwierdziliśmy, że to daje błąd „Żeton dostępu jest z niewłaściwym publiczności lub zasobu”

Podaj mi rozwiązanie, za pomocą którego mogę uzyskać dostęp do interfejsu API bez żadnej interakcji użytkownika.

Dzięki z góry.

Oto mój kod:

{ 
    string token = GetOAuthTokenFromAAD(); 
    string requestURL = String.Format("{0}/{1}/{2}/{3}", 
        ConfigurationManager.AppSettings["ARMBillingServiceURL"], 
        "subscriptions", 
        ConfigurationManager.AppSettings["SubscriptionID"], 
        "providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview&$filter=OfferDurableId eq 'MS-AZR-*****' and Currency eq 'INR' and Locale eq 'en-IN' and RegionInfo eq 'IN'"); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL); 

    request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token); 
    request.ContentType = "application/json"; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    Console.WriteLine(String.Format("RateCard service response status: {0}", response.StatusDescription)); 
} 

public static string GetOAuthTokenFromAAD() 
{ 
     AuthenticationContext authenticationContext = new AuthenticationContext(string.Format("{0}/{1}",ConfigurationManager.AppSettings["ADALServiceURL"], ConfigurationManager.AppSettings["TenantDomain"])); 

     AuthenticationResult result = null; 
     ClientCredential uc = new ClientCredential(Client_Id, Secret_Key); 
     try 
     { 
      result = authenticationContext.AcquireToken("https://management.core.windows.net/", uc); 
     } 
     return result.AccessToken; 
} 

//App Config File 
<add key="ADALServiceURL" value="https://login.microsoftonline.com" /> 
<add key="ADALRedirectURL" value="http://*****-authentication.cloudapp.net" /> 
<add key="ARMBillingServiceURL" value="https://management.core.windows.net" /> 
<add key="TenantDomain" value="********.onmicrosoft.com" /> 
<add key="SubscriptionID" value="*******-****-****-****-********" /> 
<add key="ClientId" value="*******-****-****-****-********" /> 
+0

Proszę udostępnić swój kod, a także ustawienia aplikacji utworzonej w usłudze Azure AD. –

+0

Dodano we wpisie. – Tejas

+0

Jedno szybkie pytanie - czy podczas konfigurowania aplikacji w usłudze Azure AD dodano uprawnienia do wykonywania operacji interfejsu API zarządzania usługami? –

Odpowiedz

1

Aktualizacja: Ja również tych metod jako wielokrotnego użytku Authentication Helper Class Library. Można znaleźć takie same pod tym linkiem: Azure Authentication - Authenticating any Azure API Request in your Application

Metoda 1: na stosowanie metody hasło nieinteraktywnie trzeba najpierw wykonać sekcję poniższej Post „Uwierzytelnianie hasłem - PowerShell”: Authenticating a service principal with ARM

Następnie użyj poniższego fragmentu kodu, aby pobrać token.

var authenticationContext = new AuthenticationContext(String.Format("{0}/{1}", 
                   ConfigurationManager.AppSettings["ADALServiceURL"], 
                   ConfigurationManager.AppSettings["TenantDomain"])); 
     var credential = new ClientCredential(clientId: "11a11111-11a1-111a-a111-1afeda2bca1a", clientSecret: "passwordhere"); 
     var result = authenticationContext.AcquireToken(resource: "https://management.core.windows.net/", clientCredential: credential); 

     if (result == null) 
     { 
      throw new InvalidOperationException("Failed to obtain the JWT token"); 
     } 

     string token = result.AccessToken; 

     return token; 

Alternatywnie (metoda 2), można również użyć metody certyfikatu. W takim przypadku użyj tego samego łącza, co powyżej, ale skorzystaj z sekcji "Uwierzytelnij za pomocą certyfikatu - PowerShell" z tego linku. Następnie użyj poniższego fragmentu kodu do pobrania nieinteraktywnego tokenu:

var subscriptionId = "1a11aa11-5c9b-4c94-b875-b7b55af5d316"; 
     string tenant = "1a11111a-5713-4b00-a1c3-88da50be3ace"; 
     string clientId = "aa11a111-1050-4892-a2d8-4747441be14d"; 

     var authContext = new AuthenticationContext(string.Format("https://login.windows.net/{0}", tenant)); 

     X509Certificate2 cert = null; 
     X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
     string certName = "MyCert01"; 

     try 
     { 
      store.Open(OpenFlags.ReadOnly); 
      var certCollection = store.Certificates; 
      var certs = certCollection.Find(X509FindType.FindBySubjectName, certName, false); 
      //var certs = certCollection.Find(X509FindType.FindBySerialNumber, "E144928868B609D35F72", false); 
      if (certs == null || certs.Count <= 0) 
      { 
       throw new Exception("Certificate " + certName + " not found."); 
      } 
      cert = certs[0]; 
     } 
     finally 
     { 
      store.Close(); 
     } 

     var certCred = new ClientAssertionCertificate(clientId, cert); 
     var token = authContext.AcquireToken("https://management.core.windows.net/", certCred); 
     var creds = new TokenCloudCredentials(subscriptionId, token.AccessToken); 
     //var client = new ResourceManagementClient(creds); 
     return token.AccessToken;