我正在开发一个将由客户端应用程序使用的Web API。我使用的 AD 身份验证机制是"使用应用程序的权限调用 Web API"。
客户端应用使用应用程序权限调用 Web api,在 Web API 中,我尝试使用 Azure Rest API 来管理 Azure 资源。Azure Rest API 通过使用用户断言生成令牌来代表用户使用。
我们遇到了
"AADSTS50058:已发送静默登录请求,但没有用户签名 代表用户令牌生成的问题">
尝试生成访问令牌时。
当客户端应用到 Web API 遵循Application Identity with OAuth 2.0 Client Credentials Grant
方法并且 Web API 尝试代表客户端 AD 应用使用 Azure REST/管理 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)
代表获取一个令牌,以调用此应用的用户身份调用另一个 API。
如果您的 API 是由应用使用客户端凭据调用的,则没有用户。
因此,在这种情况下,您不能使用"代表"。