Как удалить AppRoleAssignment с помощью Azure Active Directory .NET SDK?

1

Я пытаюсь выяснить, как удалить 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?

Теги:
azure
azure-active-directory
active-directory

2 ответа

1

Хотя он не исправлен, вы можете сделать ручной 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;
}
  • 0
    Спасибо. Это прекрасно работает. Просто из любопытства, в ADAL Graph API по-прежнему нет поддержки для удаления Назначения ролей приложения только с помощью однострочного кода, например deleteAsync
  • 0
    Я не знаю. К счастью, с тех пор я не работал с AzureAD.
0
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

  • 2
    Спасибо, но твой пример не работает. Где не метод расширения от user.AppRoleAssignments, так как это IPagedCollection, и даже если вы выполняете итерацию, назначения не загружаются. Попытка .Expand из IUserFetcher (из Users.GetByObjectId) для их загрузки вызывает исключение. Я пробовал DeleteAsync на экземплярах AppRoleAssignment ранее (он реализует IEntityBase), и это также вызывает исключение, поскольку он делает неправильный запрос (см. Вопрос).
  • 1
    Извините за задержку ответа здесь, Даниэль. У нас есть проблема в клиентской библиотеке, которую мы отслеживаем для этого - как вы обнаружили, в настоящее время это невозможно с помощью метода DeleteAsync (). Мы надеемся, что вскоре мы получим исправление, позволяющее удалять назначения ролей приложения.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню