Как использовать Microsoft Graph API, чтобы получить все группы для авторизации в основном приложении .net? - PullRequest
0 голосов
/ 25 сентября 2019

Я работаю над основным проектом .net.Я пытаюсь реализовать авторизацию с использованием групп AD.Мое требование: у меня много групп в лазурном объявлении.Если текущий пользователь принадлежит к какой-либо из доступных групп в Azure Ad, то я хочу разрешить этим пользователям доступ к API, написанному в основном приложении .net.Я попробовал как ниже.Ниже я добавил два класса

 public class IsMemberOfGroupHandler : AuthorizationHandler<IsMemberOfGroupRequirement>
    {
        protected override Task HandleRequirementAsync(
            AuthorizationHandlerContext context, IsMemberOfGroupRequirement requirement)
        {
            var groupClaim = context.User.Claims
                 .FirstOrDefault(claim => claim.Type == "groups" &&
                     claim.Value.Equals(requirement.GroupId, StringComparison.InvariantCultureIgnoreCase));

            if (groupClaim != null)
                context.Succeed(requirement);

            return Task.CompletedTask;
        }
    }

 public class IsMemberOfGroupRequirement : IAuthorizationRequirement
    {
        public readonly string GroupId;
        public readonly string GroupName;

        public IsMemberOfGroupRequirement(string groupName, string groupId)
        {
            GroupName = groupName;
            GroupId = groupId;
        }
    }

Ниже приведен мой класс запуска.

 services.AddAuthorization(options =>
            {
                var adGroupConfig = new List<AdGroupConfig>();
                _configuration.Bind("AdGroups", adGroupConfig);

                foreach (var adGroup in adGroupConfig)
                    options.AddPolicy(
                        adGroup.GroupName,
                        policy =>
                            policy.AddRequirements(new IsMemberOfGroupRequirement(adGroup.GroupName, adGroup.GroupId)));
            });

Выше кода проверяет группы, доступные в файле конфигурации.Теперь мое требование заключается в использовании Microsoft API Graph API, чтобы получить все доступные группы.Я не мог найти способ справиться с этим требованием.Может кто-то помочь мне с этим?Любая помощь будет оценена.Спасибо

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Сначала проверьте этот пример кода , который использует OpenID Connect для входа в систему пользователей и использует MSAL для получения токена Microsoft Graph API для удаления групп.

Если вы сконфигурируете свое приложение наполучить утверждения группы путем редактирования манифеста:

{
  ...
  "errorUrl": null,
  "groupMembershipClaims": "SecurityGroup",
  ...
}

Идентификатор объекта групп безопасности, членом которых является зарегистрированный пользователь, возвращается в утверждении группы токена.

Если пользователь является участником большего числа групп, чем предел превышения (150 для токенов SAML, 200 для токенов JWT), то платформа Microsoft Identity Platform не отправляет утверждение о группах в токене.Вместо этого он включает избыточное требование в токене, которое указывает приложению на запрос API Graph для получения членства в группе пользователя.

{
  ...
  "_claim_names": {
    "groups": "src1"
    },
    {
   "_claim_sources": {
    "src1": {
        "endpoint":"[Graph Url to get this user's group membership from]"
        }
    }
  ...
}

Таким образом, вы можете следить за процессом:

  1. Проверьте наличие в заявке _claim_names с одним из значений, являющихся группами.Это указывает на переизбыток.

  2. Если найден, вызовите конечную точку, указанную в _claim_sources, чтобы получить группы пользователей.

  3. Если ничего не найдено, посмотритев заявку на группы для групп пользователей.

Конечно, вы можете напрямую вызывать Microsoft Graph API для вывода групп текущего пользователя без , используя group claims:

https://docs.microsoft.com/en-us/graph/api/user-list-memberof?view=graph-rest-1.0&tabs=http

Затем вы можете авторизоваться на основе этих групп.Например, если используется политика:

services.AddAuthorization(options =>
{
    options.AddPolicy("GroupsCheck", policy =>
        policy.Requirements.Add(new GroupsCheckRequirement("YourGroupID")));
});
services.AddScoped<IAuthorizationHandler, GroupsCheckHandler>();

GroupsCheckRequirement.cs:

public class GroupsCheckRequirement : IAuthorizationRequirement
{
    public string groups;

    public GroupsCheckRequirement(string groups)
    {
        this.groups = groups;
    }
}

GroupsCheckHandler.cs:

public class GroupsCheckHandler : AuthorizationHandler<GroupsCheckRequirement>
{
    private readonly ITokenAcquisition tokenAcquisition;
    private readonly IMSGraphService graphService;

    public GroupsCheckHandler(ITokenAcquisition tokenAcquisition, IMSGraphService MSGraphService)
    {
        this.tokenAcquisition = tokenAcquisition;
        this.graphService = MSGraphService;
    }
    protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                              GroupsCheckRequirement requirement)
    {
        string accessToken = await tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(new[] { Constants.ScopeUserRead, Constants.ScopeDirectoryReadAll });

        User me = await graphService.GetMeAsync(accessToken);

        IList<Group> groups = await graphService.GetMyMemberOfGroupsAsync(accessToken);

        var result = false;
        foreach (var group in groups)
        {
            if (requirement.groups.Equals(group.Id))
            {
                result = true;
            }
        }

        if (result)
        {
            context.Succeed(requirement);
        }

    }


}

А затем с использованием политики:

[Authorize(Policy = "GroupsCheck")] 
1 голос
/ 26 сентября 2019

Вы можете использовать этот график API , чтобы получить все группы, непосредственным членом которых является пользователь.

GET /me/memberOf

В .net-core вы можете использовать GraphServiceClient для вызова графа API.Вот образец для вашей справки.

var graphClient = new GraphServiceClient(
                new DelegateAuthenticationProvider(
                    (requestMessage) =>
                    {
                        // Get back the access token.
                        var accessToken = "";

                        if (!String.IsNullOrEmpty(accessToken))
                        {
                            // Configure the HTTP bearer Authorization Header
                            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
                        }
                        else
                        {
                            throw new Exception("Invalid authorization context");
                        }

                        return (Task.FromResult(0));
                    }
                    ));
            var groups = graphClient.Me.MemberOf.Request().GetAsync().Result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...