2017-12-11 2 views
0

IdentityServer4에 WSFederation 인증 공급자를 추가하려고합니다. 최근에 Microsoft.AspNetCore.Authentication.WsFederation Preview 2이 출시되었으며이를 정상적인 Asp.NetCore-Application에 추가 할 수있었습니다..Net Core WSFederation preview2를 사용하는 IdentityServer4.

그러나 IdentityServer4 EntityFramework-Quickstart-Example에 추가하는 데 어려움을 겪고 있습니다. 내 Startup.cs/ConfigureServices-방법에 AuthenticationProvider에 추가하는 방법을

은 다음과 같습니다. 나는 프런트 엔드에 WSFederation의 버튼을했고 나는 또한 로그인 할 수 있습니다하지만 콜백 후 내가 얻을
services.AddAuthentication() 
       .AddWsFederation("WsFederation", options => 
       { 
        options.Wtrealm = realm; 
        options.MetadataAddress = metadata; 
       }) 

: -이 오류 WSFed 같은 주장을 반환하지 않는이가 IdentityServer4의 IdentityServerAuthenticationService.cs에서 this line입니다, 어디에서 오는지

InvalidOperationException: sub claim is missing IdentityServer4.Hosting.IdentityServerAuthenticationService.AssertRequiredClaims(ClaimsPrincipal principal)

내가 이해할 수있는, 그것은 "하위"-claim 기대

if (principal.FindFirst(JwtClaimTypes.Subject) == null) throw new InvalidOperationException("sub claim is missing"); 

지금까지 나는 그들이이 사용될 수 있습니다처럼 보일 빠른 시작 - 프로젝트의 일부 테이블은, 특히 2가 있지만, 나는이 주장을 구성 할 수 없습니다 볼 수 있습니다 : dbo.IdentityResources-table dbo.IdentityClaims-table

이미 제목에 대한 소유권 주장 대신 테이블에 사용하려는 소유권 주장을 추가하려고했지만 영향력이없는 것으로 보입니다. 또한 데이터베이스가 내가 추가 한 ID 공급자에 매핑되는 방식을 모르겠습니다. 코드에서. 나는 다음 단계에 대한 어떤 힌트라도 기뻐할 것이며, 어떤 예를 알게된다면 더 나아질 것입니다.

추신 : 이미이 항목과 관련하여 몇 가지 질문이 있지만 WSFederation의 .Net Core 구현을 사용할 수 있거나 WSFederation 서버의 샘플을 참조하지만 클라이언트는 참조하지 않았습니다.

+0

난 그냥 ("하위"같은) IdentityProvider 호환 주장 (UPN 같은) WSFed-주장을 변환하는 WSFederation 인증을 확장하는 사용자 정의 AuthenticationProvider에 뭔가를 구현하는 생각을했다 -하지만 이것이 가장 우아한 방법이 될지 모르겠습니다. 소스 코드를 단계별로 실행하고 문서를 읽음으로써 더 많은 것을 찾으려고합니다. – Compufreak

답변

1

덕분에 @leastprivilege하는 나는 서브를 제공하기 위해 다음과 같은 해결 방법을 구현 -claim :

services.AddAuthentication() 
       .AddWsFederation("WsFederation", options => 
       { 
        options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 
        options.Wtrealm = realm; 
        options.MetadataAddress = metadata; 
        options.Events.OnTicketReceived += OnTicketReceived; 
       }) 

/* some more code inbetween */ 

    /// <summary> 
    /// Transform the UPN-claim to the sub-claim to be compatible with IdentityServer4 
    /// </summary> 
    private async Task OnTicketReceived(TicketReceivedContext ticketReceivedContext) 
    { 
     var identity = ticketReceivedContext.Principal.Identities.First(); 
     identity.AddClaim(new Claim("sub", ticketReceivedContext.Principal.FindFirstValue("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"))); 

    } 
2

WS-Fed 제공 업체에서 제공하는 클레임에 클레임 변환을 수행해야합니다. 어느 WS-연준 핸들러 자체에 대한 이벤트 처리하여 - 빠른 시작의 UI에서 사용 또는 "ExternalLoginCallback"패턴을 사용하여를 :

https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/release/Quickstart/Account/AccountController.cs#L203

+0

고마워요. ExternalLoginCallback이 충돌하기 전에 하위 클레임 검사가 끝나기 때문에 IdentityLoger를 fork하지 않고 유일한 옵션처럼 보이지만 ExternalLoginCallback보다 먼저 AuthenticationHandler 자체에서 변환을 수행해야합니다. 나는 그것을 시도하고 다시보고 할 것이다. – Compufreak

+0

하위 클래임에 새 ID를 추가하는 OnTicketReceived-Eventhandler를 구현했습니다. 내 질문의 맨 아래에 코드를 추가했습니다. 적절한 해결책이라고 생각한다면 코드를 답안에 추가하여 자유롭게 해결할 수 있습니다. – Compufreak

+0

ExternalLoginCallback은 IdentityServer 코드베이스의 일부가 아닙니다. UI에 있습니다. 그래서 당신이 선호하는 것. – leastprivilege

관련 문제