Я пытаюсь найти правильный способ, с помощью которого я могу внедрить службу для проверки, если пользователь существует или зарегистрирован в моем приложении после успешной аутентификации от внешнего поставщика удостоверений, такого как Azure Active Directory.Я хочу перенаправить пользователя на пользовательскую страницу ошибки или отобразить сообщение «Неавторизовано», если его учетная запись еще не зарегистрирована в моем приложении.
Я попытался использовать интерфейс IProfileService, но, похоже, это не правильный способgo.
Вот мои настройки Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services
.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddTestUsers(Config.GetUsers())
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients()) // Client was configured with RequireConsent = false, EnableLocalLogin = false,
.AddProfileService<ProfileService>()
.Services.AddTransient<IUserRepository,UserRepository>();
services.AddAuthentication()
.AddOpenIdConnect("AAD", "Azure Active Directory", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.SignOutScheme = IdentityServerConstants.SignoutScheme;
options.Authority = "https://login.microsoftonline.com/MyTenant";
options.ClientId = "MyClientId";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false
};
options.GetClaimsFromUserInfoEndpoint = true;
});
}
public class ProfileService : IProfileService
{
private readonly IUserRepository _userRepository;
public ProfileService(IUserRepository userRepository)
{
_userRepository = userRepository
}
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var user = _userRepository.FindByUser(context.Subject.Identity.Name);
// This will display HTTP 500 instead of 401
if(user == null) throw new UnauthorizedAccessException("You're not registered");
// I add custom claims here
return Task.FromResult(0);
}
public Task IsActiveAsync(IsActiveContext context) => Task.FromResult(0);
}
Есть ли какая-либо доступная служба или интерфейс, который я могу использовать, где я могу внедрить подтверждение пользователя, а также разрешить вводить мойхранилище пользователей в этом сервисе?Можно ли внедрить этот процесс внутри IdentityServer4?Может ли кто-нибудь указать мне правильное направление для достижения моей цели с помощью IdentityServer4?
Примечание: Допустим, у меня есть веб-приложение SPA, и у меня есть собственный механизм регистрации.Я не хочу перенаправлять обратно в мой SPA, если пользователь не существует, и обрабатывать его внутри IdentityServer4.Кстати, некоторые из приведенного выше кода не включены для краткости.