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

net базовое веб-приложение API. Я настроил Swagger для моего веб-приложения API. Я делаю аутентификацию и авторизацию от swagger, и у меня нет webapp или SPA. Теперь я хочу сделать авторизацию на основе групп. Когда я увидел токен JWT, я увидел hasgroups: true, а не идентификаторы групп. Это изменяется, если более 5 групп связаны с пользователем. Пожалуйста, поправьте меня, если мое понимание неверно. Так что теперь у меня есть группы: правда. Таким образом, чтобы получить группы, мне нужно вызвать графа API. Как только я получаю группы из API графа, мне нужно создавать политики. Это мое понимание и, пожалуйста, поправьте меня, если я на неправильном пути. Теперь у меня есть нижеприведенное веб-приложение API.

Startup.cs

public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            azureActiveDirectoryOptions = Configuration.GetSection("AzureAd").Get<AzureActiveDirectoryOptions>();
            swaggerUIOptions = Configuration.GetSection("Swagger").Get<SwaggerUIOptions>();
        }

        public IConfiguration Configuration { get; }
        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
                       },
                   };
               });

            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();
        }
    }

У меня API, как показано ниже.

[Authorize]
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private IHttpContextAccessor _httpContextAccessor;
        public ValuesController(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }
        // GET api/values
        [HttpGet]
        public ActionResult<string> Get()
        {
            string owner = (User.FindFirst(ClaimTypes.Name))?.Value;
            var accessToken = _httpContextAccessor.HttpContext.Request.Headers["Authorization"];
            return owner;
        }
    }

Теперь после входа в систему я могу нажать на API. Теперь я хочу иметь что-то вроде Авторизации (администратор / пользователь) на основе групп, которые я хочу контролировать авторизацию. Теперь у меня возникли проблемы, когда я должен вызвать Graph API и получить группы. Может ли кто-нибудь помочь мне понять это? Любая помощь будет оценена. Спасибо

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Да. Поток импликов имеет ограничение для заявок групп. Чтобы использовать Microsoft Graph для получения групп текущего пользователя, вы можете попробовать следующие способы:

  1. Используйте от имени от имени для получения токена доступа, который позволяет API для вызова MS Graph как пользователя, здесь - это пример кода.

  2. Используйте поток учетных данных клиента для получения токена доступа Microsoft Graph в сети API, этот поток использует разрешение приложения без пользовательского контекста. Пример кода здесь предназначен для Azure AD V1.0 с использованием ADAL. И здесь - это пример кода для Azure AD V2.0 с использованием MSAL.

0 голосов
/ 12 января 2020

Какой протол и какой поток вы используете.

...