1

クライアント アプリケーションで使用される Web API を開発しています。私が使用したAD認証メカニズムは、「アプリケーションのアクセス許可でWeb APIを呼び出す」です。

クライアント アプリは、アプリケーションのアクセス許可を使用して Web API を呼び出します。Web API では、Azure リソースを管理するために Azure Rest API を使用しようとしています。Azure Rest API は、ユーザー アサーションを使用してトークンを生成することにより、ユーザーに代わって使用されています。

私たちは遭遇しています

"AADSTS50058: サイレント サインイン要求が送信されましたが、ユーザー トークン生成の代理でサインインしているユーザーがいません"

アクセストークンを生成しようとしたとき。

Application Identity with OAuth 2.0 Client Credentials Grantクライアント アプリから Web APIへのアプローチがアプローチに従い、Web API がクライアント AD アプリに代わって Azure REST/Managment API を使用しようとする場合、ユーザー シナリオの代わりに機能しますか?

  ClientCredential clientCredential = new ClientCredential(ConfigurationManager.AppSettings["ida:ClientId"], ConfigurationManager.AppSettings["ida:SecretKey"]);
            AuthenticationContext authContext = new AuthenticationContext(authority);

            var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext;
            string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;

            UserAssertion userAssertion = new UserAssertion(bootstrapContext.ToString(), "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);
            AuthenticationResult result = await authContext.AcquireTokenAsync(ConfigurationManager.AppSettings["AzureResourceManagerIdentifier"], clientCredential, userAssertion);

            // Get subscriptions to which the user has some kind of access
            //string requestUrl =https://management.azure.com/subscriptions?api-version=2014-04-01"
            string requestUrl = string.Format("{0}/subscriptions?api-version={1}", ConfigurationManager.AppSettings["AzureResourceManagerUrl"], AzureResourceManagerAPIVersion);

            // Make the GET request
            HttpClient client = new HttpClient();
            HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);
            request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
            HttpResponseMessage response = client.SendAsync(request).Result;
            if (response.IsSuccessStatusCode)
4

1 に答える 1