2009-03-14 3 views
13

TcpClient/TcpListener 및 SslStream을 기반으로하는 간단한 클라이언트 - 서버 응용 프로그램이 있습니다. 클라이언트는 X509Certificate를 사용하거나 SslStream이 설정된 후 사용자 이름과 암호를 보내 서버를 인증 할 수 있습니다. 재미있는 소리 - 임의의 응용 프로그램에서 사용할 수 있습니다자체 클라이언트 - 서버 응용 프로그램에서 System.IdentityModel을 사용하는 방법

WCF 인증 목적으로 System.IdentityModel 네임 스페이스를 사용합니다

하지만 apparently. 이렇게하는 방법에 대한 정보는 부족합니다 (또는 현재 Google foo가 약함).

내 질문은 : System.IdentityModel을 내 응용 프로그램과 통합하려면 어떻게해야합니까? 모든 ClaimSet 항목이 필요한지 확실하지 않지만 사용자가 Windows 계정 또는 기타 제공된 인증 메커니즘을 사용하여 로그인 할 수 있으면 좋을 것입니다. (불행히도 WCF로 전환 할 수는 없지만 맞춤 프로토콜을 사용해야한다. 필요하다면 약간의 변경을 할 수있다.)

답변

17

내 Google foo는 실제로 약했다. 대답은 내 질문에 대한 링크 바로 뒤에 있습니다. 그래서 누군가가 동일한 질문을 결국 가지고있는 경우에 대비하여 this blog에 대한 몇 가지 링크가 있습니다.

첫째, 당신은 "설정 물건을 주장하는"이해하려고 노력한다 :

,536,913 청구 세트 어디에서 온 63,210

그런 다음, 당신이 알아야 할이 지식

무장, 실제로는 매우 간단해진다.

내가 제대로 이해한다면, 기본 워크 플로우 이런 식으로 뭔가 될 것이다 :

  1. 클라이언트는 SecurityTokenProvider
  2. 클라이언트를 사용하여 SecurityToken 생성은 SecurityTokenSerializer
  3. 서버를 사용하여 SecurityToken가 사용 SecurityToken를 역 직렬화 직렬화 a SecurityTokenSerializer
  4. 서버는 SecurityTokenAuthenticator
  5. 0123을 사용하여 IAuthorizationPolicy을 만듭니다. 516,
  6. 서버가 생성 AuthorizationContextIAuthorizationPolicy들로부터
  7. 가 완료

예 :

// Create the SecurityTokenProvider 
var p = new UserNameSecurityTokenProvider("username", "password"); 

// Get the SecurityToken from the SecurityTokenProvider 
var t = p.GetToken(TimeSpan.FromSeconds(1.0)) as UserNameSecurityToken; 

// ... transmit SecurityToken to server ... 

// Create the SecurityTokenAuthenticator 
var a = new CustomUserNameSecurityTokenAuthenticator(
    UserNamePasswordValidator.None); 

// Create IAuthorizationPolicies from SecurityToken 
var i = a.ValidateToken(t); 

// Create AuthorizationContext from IAuthorizationPolicies 
var c = AuthorizationContext.CreateDefaultAuthorizationContext(i); 
ShowClaims(c.ClaimSets); 

X509SecurityToken 들어 S는 X509SecurityTokenProvider/Authenticator를 사용한다. WindowsSecurityToken에는 WindowsSecurityTokenAuthenticator가 있지만 공급자는 아닙니다. 대신 생성자를 사용하십시오.

var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent()); 

이 방법은 매우 효과적입니다. 지금까지 생략 한 유일한 점은 토큰 직렬화입니다. SecurityTokenSerializer 클래스에는 .NET 프레임 워크에 구현 된 하나의 구현 인 WCF와 함께 제공되는 WSSecurityTokenSerializer 클래스가 있습니다.

직렬화 UserNameSecurityToken들과 마법처럼 X509SecurityToken의 작품 (직렬화 복원을 시도하지 않은), 그러나 WindowsSecurityToken들 분명히 시리얼 라이저에서 지원되지 않습니다. 이로 인해 나는 이미 가지고있는 두 가지 인증 방법 (인증서 및 사용자 이름/암호)을 남겨 둡니다. 어쨌든 AuthorizationContext을 원하지 않았기 때문에 나는 가지고있는 것을 고수 할 것입니다 :

+1

누군가가 관심이있는 경우 SecurityToken을 클라이언트 측에서 만들어 서버로 전송해야하는지 확신 할 수 없습니다. X.509 보안의 경우 서버와 함께 SslStream을 시작하고 서버 인증서에서 X509SecurityToken을 만드는 것이 훨씬 더 합리적입니다. Windows 보안의 경우 NegotiateStream이 사용되면 negotiateStream.RemoteIdentity에서 WindowsSecurityToken을 만들 수 있습니다. 물론 사용자 이름/비밀번호 보안의 경우 사용자 이름과 비밀번호를 전송해야합니다. – dtb

7

저는 가지고 있지 않습니다. 기존 솔루션에 대한 의견을 게시하는 평판은 있지만 솔루션에 나열된 블로그에 새로운 URL을 게시하고 싶습니다. 더 이상 작동하지 않기 때문입니다. 누군가가 이것을 주석으로 바꿀 수 있다면, 나는 많은 의무가있을 것이다.

+1

고정 링크를 반영하기 위해 @ dtb의 대답을 편집했습니다.동료가 검토하는 즉시 표시되어야합니다. 감사! –

+0

2016 년 9 월 현재 일부 링크가 끊어졌습니다. – JPK

관련 문제