2016-01-01 24 views
6

İade Fatura Kullanımı ve Ratecard ayrıntıları almak için Azure REST API kullanıyorum. AcquireToken() Yöntemini kullanarak Token'i elde etmek için başlangıçta yalnızca İstemci Kimliği kullanılır, ardından oturum açma penceresinde Kullanıcı Kimlik Bilgileri istenir.Azure Faturalandırma Kullanım API'si 401 Yetkisiz

Ancak, ben bu yüzden ben Müşteri kimliği ve Müşteri Gizli Anahtarı geçti ki İstemci Kimlik Bilgilerini kullanılan Olmayan İnteraktif Yaklaşım arıyorum.

Ama derinden yanılgıya baktığımızda

, ben hata

"erişim jetonu yanlış kitleye veya kaynaktan edilir" verdiğini bulundu "Uzak Sunucu 401 Yetkisiz bir hata verir" verir

Lütfen herhangi bir kullanıcı etkileşimi olmadan API'ye erişebildiğim herhangi bir çözümü verin.

Teşekkürler.

{ 
    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

Lütfen kodunuzu ve Azure AD'de oluşturduğunuz uygulamanın ayarlarını paylaşın. –

+0

Yayına eklendi. – Tejas

+0

Tek bir soru - Uygulamayı Azure AD'de yapılandırırken Hizmet Yönetimi API'sı işlemlerini yürütmek için izin eklediniz mi? –

cevap

1

Güncelleme:

İşte benim kodudur Ben de bir Tekrar Kullanılabilir Kimlik Doğrulama Yardımcısı sınıf kitaplığı olarak bu yöntemleri sağladı. öncelikle "- PowerShell şifre ile kimlik doğrulaması" altında yayının bölüm izlemeniz gerekir olmayan etkileşimli şifre yaklaşımını kullanmak için: Authenticating a service principal with ARM

Azure Authentication - Authenticating any Azure API Request in your Application

Yöntem: Bu linkten aynı bulabilirsiniz

Ardından jetonu almak için aşağıdaki kod snippet'ini kullanın. Alternatif olarak

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; 

(Yöntem 2), sertifika yöntemini kullanabilir. Bu durumda yukarıdakiyle aynı bağlantıyı kullanın, ancak bu bağlantıdan "Sertifika ile yetkilendir - PowerShell" bölümünü izleyin. Ardından, belirteci etkileşimsiz bir şekilde almak için aşağıdaki kod parçacığını kullanın:

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; 
İlgili konular