Я пытаюсь выяснить, как удалить AppRoleAssignment
из группы или пользователя с помощью Graph API для Azure Active Directory. Я использую.NET SDK (Microsoft.Azure.ActiveDirectory.GraphClient).
Я пробовал использовать стандартный метод DeleteAsync
который на каждом IEntityBase
, но с ошибкой не работает. Он выдает HTTP-запрос, который выглядит так:
DELETE/{tenantId}/directoryObjects/{appRoleAssignment ObjectID}/Microsoft.DirectoryServices.AppRoleAssignment?api-version=1.5
который не работает с 400 Bad Request с ошибкой "Прямые запросы к этому типу ресурсов не поддерживаются".
Это неправильный способ удаления AppRoleAssignments с помощью Graph API в соответствии с этой записью Microsoft, в которой говорится, что вам нужно выполнить HTTP-запрос, который выглядит так:
DELETE/{tenantId}/users/{user object ID}/appRoleAssignments/{appRoleAs}?api-version=1.5
Если я выполняю ручной HTTP-запрос с использованием HttpClient с использованием этого формата URL-адреса, он работает, но я хочу знать, как это сделать в рамках библиотеки.NET, а не выполнять вручную запросы HTTP.
Как удалить AppRoleAssignments через библиотеку.NET?
Хотя он не исправлен, вы можете сделать ручной HTTP-запрос, но все еще используете Azure AD SDK для определения токена. Что-то вроде этого:
var tenantId = "<guid> tenant id";
var appId = "<guid> your Azure app id";
var appKey = "your app key";
var authority = "i.e. https://login.windows.net/mycompany.onmicrosoft.com";
var graphUrl = "https://graph.windows.net/";
public async Task RemoveRoleFromUser(Guid userId, string roleObjectId) {
var uri = string.Format("{0}/users/{1}/appRoleAssignments/{2}?api-version=1.5", tenantId, userId, roleObjectId);
await ExecuteRequest<object>(uri, HttpMethod.Delete);
}
private async Task<T> ExecuteRequest<T>(string uri, HttpMethod method = null, Object body = null) where T : class {
if (method == null) method = HttpMethod.Get;
T response;
var token = await AcquireTokenAsyncForApplication();
using (var httpClient = new HttpClient { BaseAddress = getServicePointUri() }) {
var request = new HttpRequestMessage(method, uri);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
if (body != null) {
request.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json");
}
var responseMessage = await httpClient.SendAsync(request).ConfigureAwait(false);
responseMessage.EnsureSuccessStatusCode();
response = await responseMessage.Content.ReadAsAsync<T>();
}
return response;
}
private async Task<string> AcquireTokenAsyncForApplication() {
ClientCredential clientCred = new ClientCredential(appId, appKey);
var authenticationContext = new AuthenticationContext(authority, false);
AuthenticationResult authenticationResult = authenticationContext.AcquireToken(graphUrl, clientCred);
return authenticationResult.AccessToken;
}
private Uri getServicePointUri() {
Uri servicePointUri = new Uri(graphUrl);
Uri serviceRoot = new Uri(servicePointUri, tenantId);
return serviceRoot;
}
ActiveDirectoryClient client = AuthenticationHelper.GetActiveDirectoryClient();
user = (User) await client.Users.GetByObjectId(objectId).ExecuteAsync();
var roleId = "";
await user.AppRoleAssignments.Where(t=>t.ObjectId==roleId).FirstOrDefault().DeleteAsync();
Возможно, вам помогут следующие веб-сайты:
https://github.com/AzureADSamples/WebApp-RoleClaims-DotNet https://github.com/AzureADSamples/WebApp-GraphAPI-DotNet