Как сделать Авторизацию на основе Azure групп AD? - PullRequest
0 голосов
/ 04 февраля 2020

Привет, я пытаюсь реализовать Azure авторизацию на основе групп в моем. net основном приложении. У меня есть больше групп, например от 100 до 200. Я добавил политики для добавления авторизации.

services.AddAuthorization(options =>
            {   
                options.AddPolicy("GroupsCheck", policy =>
                {
                    policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
                    policy.RequireAuthenticatedUser();
                    policy.Requirements.Add(new GroupsCheckRequirement("11b250bf-76c0-4efe-99f2-2d781bae43bb")); //currently hard coded but want to include all the groups returned from MS graph
                });
            });

Затем

 GraphServiceClient client = await MicrosoftGraphClient.GetGraphServiceClient();
 var groupList = await client.Users[userId].TransitiveMemberOf.Request().GetAsync();

Это вернет более 100 групп. Теперь в политику я хочу включить все эти группы. Неужели жесткое кодирование в конфигурационном файле всех групп будет лучше? Также мой токен JWT имеет только hasgroups: true, а не идентификаторы групп. Так как я могу авторизоваться на основе групп? Может ли кто-нибудь помочь мне найти хороший путь? спасибо

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Согласно моему тесту, если вы просто хотите использовать авторизацию на основе групп, обратитесь к следующему коду:

  1. изменить Startup.cs
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
      .AddAzureAD(options => configuration.Bind(configSectionName, options));
  services.Configure<AzureADOptions>(options => configuration.Bind(configSectionName, options));
services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
            {
options.Authority = options.Authority + "/v2.0/";
options.TokenValidationParameters.NameClaimType = "preferred_username";
 // Use the groups claim for populating roles
              options.TokenValidationParameters.RoleClaimType = "groups";
});
 services.AddMvc(options =>
      {
          var policy = new AuthorizationPolicyBuilder()
              .RequireAuthenticatedUser()
              .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
            })
        .SetCompatibilityVersion(CompatibilityVersion.Latest);

Добавьте следующий код в контроллер или метод
if(User.Identity.IsAuthenticated){
   if (User.IsInRole("<group id>"))
            {
                 // do other action

            }
            else if (User?.FindFirst("_claim_names")?.Value != null)
            {

                /* call Graph API to check if the user is in the group

                     for example
                     GraphServiceClient client = await MicrosoftGraphClient.GetGraphServiceClient();
var memberOfGroups= await client.Me.TransitiveMemberOf.Request().GetAsync();


                    do
                    {
                        bool breakLoops = false;

                        foreach (var directoryObject in memberOfGroups.CurrentPage)
                        {
                            if (directoryObject is Group)
                            {
                                Group group = directoryObject as Group;
                                if (group.Id == "<group id>") {

                                    breakLoops = true;
                                    break;

                                }

                            }
                        }
                        if (breakLoops)
                        {
                            break;
                        }
                        if (memberOfGroups.NextPageRequest != null)
                        {
                            memberOfGroups = await memberOfGroups.NextPageRequest.GetAsync();
                        }
                        else
                        {
                            memberOfGroups = null;
                        }
                    } while (memberOfGroups != null);

               */


            }
            else {

                // do not have enough permissions
            }

}

Для получения более подробной информации, пожалуйста, обратитесь к образец

0 голосов
/ 27 марта 2020

Я работаю над серверным приложением blazor и борюсь именно с этой проблемой, поэтому я решил опубликовать свое решение здесь :) В AuthorizationPolicyBuilder вызовите метод .RequireClaim() и укажите строку "groups" и ObjectId вашей группы безопасности.

Прежде чем это сработает, вам необходимо go войти в ваш

Azure портал -> Azure Ad -> регистрации приложений -> конфигурации токенов -> добавить заявку на группы.

Убедитесь, что вы отметили флажок в группах безопасности и флажок ID группы в { ID, Access, SAML }

I не знаю, является ли это лучшей практикой, но у меня это сработало:)

Вот код из Startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

        services.AddControllersWithViews(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .RequireClaim("groups", "<insert object id for group>")
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        });

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...