Вам необходимо настроить основной идентификатор asp.net в классе Startup вашего веб-API. К сожалению, вы не можете просто вызвать services.AddIdentity(...
в ConfigureServices, потому что за кулисами схема аутентификации на основе файлов cookie регистрируется и устанавливается в качестве схемы проверки по умолчанию, как вы можете видеть в коде здесь или в здесь для ядра asp.et 3.1. Таким образом, решение, к которому я пришел, - это скопировать и обновить метод AddIdentity следующим образом:
Для ASP.NET CORE 2.2:
public static IdentityBuilder AddIdentityForWebApi<TUser, TRole>(
this IServiceCollection services,
Action<IdentityOptions> setupAction)
where TUser : class
where TRole : class
{
// Hosting doesn't add IHttpContextAccessor by default
services.AddHttpContextAccessor();
// Identity services
services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
// No interface for the error describer so we can add errors without rev'ing the interface
services.TryAddScoped<IdentityErrorDescriber>();
services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>();
services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
services.TryAddScoped<UserManager<TUser>>();
services.TryAddScoped<SignInManager<TUser>>();
services.TryAddScoped<RoleManager<TRole>>();
if (setupAction != null)
{
services.Configure(setupAction);
}
return new IdentityBuilder(typeof(TUser), typeof(TRole), services);
}
Для ASP.NET CORE 3.1:
static IdentityBuilder AddIdentityForWebApi<TUser, TRole>(
this IServiceCollection services,
Action<IdentityOptions> setupAction)
where TUser : class
where TRole : class
{
// Hosting doesn't add IHttpContextAccessor by default
services.AddHttpContextAccessor();
// Identity services
services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>();
services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>();
services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>();
services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>();
services.TryAddScoped<IRoleValidator<TRole>, RoleValidator<TRole>>();
// No interface for the error describer so we can add errors without rev'ing the interface
services.TryAddScoped<IdentityErrorDescriber>();
services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>();
services.TryAddScoped<ITwoFactorSecurityStampValidator, TwoFactorSecurityStampValidator<TUser>>();
services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser, TRole>>();
services.TryAddScoped<IUserConfirmation<TUser>, DefaultUserConfirmation<TUser>>();
services.TryAddScoped<UserManager<TUser>>();
services.TryAddScoped<SignInManager<TUser>>();
services.TryAddScoped<RoleManager<TRole>>();
if (setupAction != null)
{
services.Configure(setupAction);
}
return new IdentityBuilder(typeof(TUser), typeof(TRole), services);
}
Затем вы должны вызвать AddIdentityForWebApi при запуске вашего веб-приложения api. Это зарегистрирует UserManager, и теперь он будет введен в конструктор вашего контроллера.
Затем вы должны правильно настроить Data Protection API (DPAPI), чтобы токен, сгенерированный вашим веб-API (когда вы вызываете _userManager.GeneratePasswordResetTokenAsync...
из своего вопроса), мог быть незащищен вашим приложением сервера идентификации.
Итак, я установил "Имя приложения DPAPI" для двух приложений в обоих ConfigureServices
методах:
services.AddDataProtection()
.dataProtectionBuilder.SetApplicationName("YOUR_DPAPI_APPLICATION_NAME");
Для производства в среде веб-фермы вам придется поделиться ключами DPAPI. В зависимости от вашей ситуации у вас есть несколько вариантов.
См. официальную документацию. для получения дополнительных сведений о настройке DPAPI.
Я тестировал Kestrel под управлением Windows, я не уверен в IIS.
person
Yanal-Yves Fargialla
schedule
26.09.2019
IdentityUser
? - person Nan Yu   schedule 25.09.2019