2016-01-01 21 views
6

私はAzure REST APIを使用して、課金の使用状況とレートカードの詳細を取得しています。 AcquireToken()メソッドを使用してトークンを取得するにはまず、クライアントIDを使用してログインウィンドウでユーザー資格情報を要求します。Azure課金用APIが返す401 Unauthorized

しかし、私はので、私はクライアントIDクライアントの秘密鍵に合格したクライアントの資格を使用し、非対話型アプローチを探しています。

しかし、それは「リモートサーバーが不正なエラー401を返します」を与える

私は深く、エラーに見たとき、私は

「アクセストークンが間違って観客またはリソースからである」それはエラー を与えることがわかりました

ユーザーの操作なしでAPIにアクセスできる解決策を教えてください。

ありがとうございました。ここで

は私のコードです:

{ 
    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

Azure ADで作成したアプリケーションのコードと設定を共有してください。 –

+0

投稿に追加されました。 – Tejas

+0

簡単な質問 - Azure ADでアプリケーションを設定するときにService Management API操作を実行する権限を追加しましたか? –

答えて

1

アップデート:私はまた、再利用可能な認証ヘルパークラスライブラリとして、これらのメソッドを提供してきました。あなたは、このリンクで同じことを見つけることができます: Azure Authentication - Authenticating any Azure API Request in your Application

方法1:非対話的にパスワードのアプローチを使用するには、まず以下の記事のセクションでは、「パスワードで認証 - PowerShellを」追跡する必要があります。 Authenticating a service principal with ARM

次に、以下のコードスニペットを使用してトークンを取得します。

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; 

代わりに(方法2)、あなたはまた、証明書のメソッドを使用することができます。その場合は上記と同じリンクを使用しますが、そのリンクから「証明書で認証する - PowerShell」セクションに従ってください。次に、以下のコードスニペットを使用して非対話形式でトークンを取得します。

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; 
関連する問題