Как сделать Azure авторизацию групп AD в. Net core web API? - PullRequest
0 голосов
/ 19 января 2020

Net основное веб-приложение. Я пытаюсь реализовать авторизацию на основе групп в своем базовом приложении. Net. Я пытаюсь вызвать группы из графа Microsoft. У меня есть некоторая путаница здесь. Ниже приведены шаги.

  1. Создано приложение Web API в. Net core 2.1
  2. Добавлена ​​поддержка swashbuckle swagger.
  3. созданное приложение в Azure AD для swagger
  4. Создано приложение в Azure AD для внутреннего интерфейса. Net core API (имя - WebServicesAPP).
  5. В приложении WebServicesAPP -> Предоставить API-> Добавить клиентское приложение -> Добавлено мое приложение чванства.
  6. В приложении WebServicesAPP -> Права доступа API -> Добавить разрешение -> API Microsoft graph -> Разрешение приложения -> Group.ReadAll
  7. изменил Oauthimplicitflow на True в манифесте .

Вот шаги, которые я предпринял. После этого я добавил соответствующий код для реализации чванства, как показано ниже. При запуске я добавил

public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services
               .AddAuthentication(o =>
               {
                   o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;

               })
               .AddJwtBearer(o =>
               {
                   o.Authority = azureActiveDirectoryOptions.Authority;

                   o.TokenValidationParameters = new TokenValidationParameters
                   {

                       ValidAudiences = new List<string>
                       {
                          azureActiveDirectoryOptions.AppIdUri,
                          azureActiveDirectoryOptions.ClientId
                       },
                       ValidateIssuer = true
                   };
               });
            services.AddScoped<IAuthorizationHandler, GroupsCheckHandler>();
            services.AddAuthorization(options =>
            {   
                options.AddPolicy("GroupsCheck", policy =>
                {
                    policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
                    policy.RequireAuthenticatedUser();
                    policy.Requirements.Add(new GroupsCheckRequirement("9da02036-fc14-4e97-ac58-2293bddae44d"));
                });
            });
            services.AddMvc(options =>
            {

                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });

                c.AddSecurityDefinition("oauth2", new OAuth2Scheme
                {
                    Type = "oauth2",
                    Flow = "implicit",
                    AuthorizationUrl = swaggerUIOptions.AuthorizationUrl,
                    TokenUrl = swaggerUIOptions.TokenUrl
                });
                c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>>
                {
                        { "oauth2", new[] { "readAccess", "writeAccess" } }
                });
            });
        }


        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }
            app.UseHttpsRedirection();

            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {

                c.OAuthClientId(swaggerUIOptions.ClientId);
                c.OAuthClientSecret(swaggerUIOptions.ClientSecret);
                c.OAuthRealm(azureActiveDirectoryOptions.ClientId);
                c.OAuthAppName("Swagger");
                c.OAuthAdditionalQueryStringParams(new { resource = azureActiveDirectoryOptions.ClientId });
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
            });
            app.UseAuthentication();
            app.UseMvc();
        }

Теперь с моим кодом выше я генерирую чванство. В swagger я нажал на вкладку «Authorize» («Авторизовать»)> и добавил свои данные для входа в систему и попытался использовать приведенный ниже пример API.

 [Authorize]
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase

С разрешениями приложения и учетными данными клиента я использую приведенный ниже код для получения токена для MS graph

AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(graphResource, clientCred).ConfigureAwait(false);
            var token = authenticationResult.AccessToken;

Как только я получаю ток из приведенного выше кода, я успешно получаю группы, как показано ниже

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

Я могу использовать API, и у меня нет проблем.

Теперь я хочу получить все группы из конечной точки API графа Microsoft. Мне нужно немного пояснить ниже.

  1. Теперь у меня уже есть токен, и могу ли я использовать тот же токен для вызова Microsoft graph API?
  2. Теперь я пытаюсь получить текущий вход в группу пользователей. поэтому при добавлении графа Microsoft у нас есть два варианта делегированного разрешения и разрешения приложения. делегированное разрешение -> Используется для вызова API графа от имени пользователя. Разрешение приложения -> Само приложение вызывает API графа Microsoft. Использование потока учетных данных клиента Он генерирует токен и передает его в граф Microsoft и проверяет подлинность.
  3. В моем случае я зарегистрировался в пользовательском объявлении и пытаюсь попасть в граф Microsoft. Итак, какой из них мне следует использовать делегированное разрешение или разрешение на применение?

Мне очень трудно это понять с давних времен, и я не вижу какого-либо соответствующего документа для моего подхода. Может ли кто-нибудь помочь мне понять это? Действительно любые предложения действительно помогут мне. Большое спасибо.

1 Ответ

1 голос
/ 19 января 2020

Теперь у меня уже есть токен, и могу ли я использовать этот токен для вызова Microsoft graph API?

Нет. Токен для вашего API. Вам нужно получить другой токен для MS Graph API, используя, например, библиотеку MSAL (https://www.nuget.org/packages/Microsoft.Identity.Client/).

Теперь я пытаюсь получить текущую авторизацию в группе пользователей, поэтому при добавлении У Microsoft graph у нас есть два варианта делегированного разрешения и разрешения приложения. делегированное разрешение -> Используется для вызова API графа от имени пользователя. Разрешение приложения -> Само приложение вызывает API графа Microsoft. Использование потока учетных данных клиента Он генерирует токен и передает его в граф Microsoft и проверяет подлинность.

В моем случае я зарегистрировался в пользовательском объявлении и пытаюсь попасть в граф Microsoft. Так какой же мне следует использовать делегированное разрешение или разрешение на применение?

Это хороший вопрос. Скорее всего, будет работать. Я склонен отдавать предпочтение делегированным разрешениям, когда это возможно, поскольку это ограничивает область, к которой моё приложение может получить доступ.

Разрешения приложений, как правило, проще в использовании, но предоставляют доступ к вашему владельцу приложения. Поскольку токен, полученный с разрешениями приложения, является одним и тем же независимо от того, какой пользователь вызывает ваш API, он может использоваться совместно и использоваться в различных запросах.

Делегированные разрешения требуют немного больше усилий для использования. В этом случае вам нужно будет обменять токен доступа, полученный вашим API, на токен MS Graph API. Но этот токен будет указан c для этого пользователя, поэтому они не могут быть общими.

Если вы используете разрешения приложения, вы можете получить токен, используя области ["https://graph.microsoft.com/.default"] и идентификатор вашего клиента + секретный / сертификат .

С делегированными разрешениями вы можете использовать те же области. .default будет использовать разрешения, назначенные приложению при регистрации. Но вам также нужно будет включить токен доступа, полученный вашим API.

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

Здесь нет лучшего варианта. Разрешения приложений определенно проще. И если это приложение используется только в вашей организации и со стороны администраторов нормально, что ваше приложение может получить доступ к любым группам пользователей, то это может быть то, с чем я бы go.

Но если нужны разрешения быть ограниченным, go с делегированным.

...