Использование Aspnetcore Identity с IdentityServer4, Active Directory и MongoDB - PullRequest
0 голосов
/ 06 декабря 2018

Желаемый поток:

  1. Пользователь обращается к контроллеру webapi или mvc с атрибутом [Authorize], когда они не вошли в систему.
  2. Запрос перенаправляется на страницу входа IdentityServer4
  3. Пользователь вводит свои учетные данные Active Directory и нажимает кнопку входа
  4. . Пользователь перенаправляется на защищенный контроллер MVC или API, для его SubjectId задано имя пользователя
  5. Приложение MVC / WebApiиспользует AspNet Identity для извлечения пользовательского объекта пользователя из MongoDB для использования в методе контроллера.

Для этого в настоящее время я пытался использовать IdentityServer4 Quickstart, настроенный вместе с IdentityServer.LdapExtension.пакет nuget (источник: IdentityServer.LdapExtension ) с этим как мой Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {

        //services.AddIdentityCore<Api.AppUser>();
        services.AddIdentity<Api.AppUser, Api.AppRole>()
            .AddMongoDbStores<Api.AppUser, Api.AppRole, string>
            (
                "mongodb://localhost:27017",
                "MongoDbTests"
            )
            .AddDefaultTokenProviders();

        services.AddMvc();

        // configure identity server with in-memory stores, keys, clients and scopes
        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            ////.AddSigningCredential(...) // Strongly recommended, if you want something more secure than developer signing (Read The Manual since it's highly recommended)
            .AddInMemoryIdentityResources(InMemoryInitConfig.GetIdentityResources())
            .AddInMemoryApiResources(InMemoryInitConfig.GetApiResources())
            .AddInMemoryClients(InMemoryInitConfig.GetClients())
            .AddLdapUsers<ActiveDirectoryAppUser>(Configuration.GetSection("ldapActiveDirectory"), UserStore.InMemory)
            .AddAspNetIdentity<Api.AppUser>();
    }

    public void Configure(IApplicationBuilder app)
    {
        if (Env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseIdentityServer();
        app.UseStaticFiles();
        app.UseMvcWithDefaultRoute();
    }

Это просто отлично аутентифицируется в ActiveDirectory и работает с примером клиента MVC из IdentityServer4.Вы также можете заметить, что я добавил в конфигурационный код AspNetCore.Identity.MongoDbCore (источник: AspNetCore.Identity.MongoDbCore ) код конфигурации (AddMongoDbStores<Api.AppUser, Api.AppRole, string>....

. Поработав некоторое время,в итоге я изменил код в AccountController IdentityServer4 Quickstart, добавив следующие строки прямо перед вызовом SignInAsync:

var mongouser = await _mongoUserStore.FindByIdAsync(user.SubjectId, CancellationToken.None);
if(mongouser == null)
{
  mongouser = new AppUser();
  mongouser.UserName = user.Username;
  mongouser.Id = user.Username;
  await _mongoUserStore.CreateAsync(mongouser, CancellationToken.None);
 }

Это создает пользователя в моей базе данных mongodb всякий раз, когда пользователь впервые регистрируетв. Я также настроил клиент MVC для хранения хранилища пользователей MongoDb с теми же классами пользователей и ролей. Однако, когда я перенаправлен обратно на контроллер клиента MVC, я получаю следующую ошибку:

Error Message

Я пытался исправить это с помощью этого ответа: c # - Значение не может быть нулевым. Имя параметра: значение, CreateIdentityAsync , но это только вызвало бесконечный цикл перенаправления, как только я далSecurityStamp значение.

Я как минимум ищу руководство о том, что мне следует искать дальше?

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