Желаемый поток:
- Пользователь обращается к контроллеру webapi или mvc с атрибутом
[Authorize]
, когда они не вошли в систему. - Запрос перенаправляется на страницу входа IdentityServer4
- Пользователь вводит свои учетные данные Active Directory и нажимает кнопку входа
- . Пользователь перенаправляется на защищенный контроллер MVC или API, для его SubjectId задано имя пользователя
- Приложение 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, я получаю следующую ошибку:
Я пытался исправить это с помощью этого ответа: c # - Значение не может быть нулевым. Имя параметра: значение, CreateIdentityAsync , но это только вызвало бесконечный цикл перенаправления, как только я далSecurityStamp значение.
Я как минимум ищу руководство о том, что мне следует искать дальше?