IdentityServer4 인증을 사용하여 사용자를 자동으로 다시 로그인하는 방법

Aug 20 2020

타사 ABP 프레임 워크 및 다중 계층 아키텍처를 기반으로하는 솔루션이 있습니다.

Angular를 웹 얼굴로 사용하고 IdentityServer4를 사용자 인증으로 사용하고 있습니다. 그래서 우리는 HTTP API 호스트와 IdentityServer 호스트, 그리고 웹 페이스와 같은 2 개의 호스트를 실행하고 있습니다. 그것은 표준 방식으로 작동합니다 : 로그인 상자, 사용자가 자격 증명을 입력합니다.

하지만 다른 테넌트에서 동일한 로그인 이름을 허용하는 사용자 지정 설정이 있습니다. 테넌트 목록은 UI에 드롭 다운으로 표시되며 현재 로그인 한 사용자 대신 선택한 테넌트를 사용하여 사용자를 다시 로그인하려고합니다. 간단한 페이지 다시로드처럼 보여야합니다. 문제는 이것을 구현하는 방법을 명확하게 이해하지 못한다는 것입니다. 응용 프로그램 계층에서 다음 호출을 사용하려고했지만 작동하지 않습니다 (오류는 " 'Identity.Application'체계에 대해 등록 된 인증 처리기가 없습니다 ..."이지만 설정 방법을 모릅니다. IdentityServer와 함께 작동 할 수 있도록 애플리케이션 계층의 인증 구성) :

    [HttpGet]
    public async Task<TenantDto> SwitchTenantForCurrentUser(Guid? tenantId)
    {
        var abxUser = await _abxUserRepository.FirstOrDefaultAsync(x => x.Login == CurrentUser.UserName && x.Tenant.AbpId == tenantId);

        if (abxUser == null)
            return null;

        using var _ = _abpCurrentTenant.Change(tenantId);

        var currentTenant = await _abxTenantRepository.FirstOrDefaultAsync(x => x.AbpId == _abpCurrentTenant.Id.Value);
        var identityUser = await _identityUserRepository.FindByNormalizedUserNameAsync(abxUser.Login.ToUpper());

        if (await _signInManager.CanSignInAsync(identityUser))
        {
            await _signInManager.SignOutAsync();
            await _signInManager.SignInAsync(identityUser, true);
        }

        return ObjectMapper.Map<Tenant, TenantDto>(currentTenant); // Not decided yet what to return, it depends on proper implementation
    }

인증에 대한 Http API 호스트의 구성 부분 :

    private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
    {
        context.Services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = configuration["AuthServer:Authority"];
                options.RequireHttpsMetadata = true;
                options.ApiName = "CentralTools";
                options.JwtBackChannelHandler = new HttpClientHandler
                {
                    //TODO: use valid certificate in future and change the logic
                    ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
                };
            });

        context.Services.AddAbpIdentity().AddDefaultTokenProviders();

답변

1 Alexander Aug 26 2020 at 16:49

임무 완수. 단계 :

  1. 백엔드 : IdentityServer 프로젝트에서 사용자 지정 부여 유형 검사기를 구현 및 등록합니다.

    SwitchToTenantGrantValidator : IdentityServer4.Validation.IExtensionGrantValidator

간단히 말해 ValidateAsync는 인증 된 사용자의 데이터 (액세스 토큰, 테넌트 ID 등)를 수락하고 사용자가 들어와야하는지 여부를 결정합니다. 메서드는 대상 테넌트의 데이터를 컨텍스트 결과 개체에 씁니다.

  1. FRONT-END : (1)에 필요한 데이터를 제공하여 지정된 사용자 지정 부여 유형으로 IdentityServer를 호출합니다. Angular를 사용했기 때문에 사용자 지정 부여 유형 요청을 지원 하기 위해 OAuthService 를 확장 해야 했습니다.

  2. 모든 것을 순서대로 가져와 ((2) 성공한 경우) UI에 올바른 데이터를 표시합니다. 예전 상태 정리 등