System.IdentityModel 자체 클라이언트 서버 응용 프로그램에서 사용하는 방법

StackOverflow https://stackoverflow.com/questions/646395

  •  22-07-2019
  •  | 
  •  

문제

tcpclient/tcplistener 및 sslstream을 기반으로 간단한 클라이언트-서버 응용 프로그램이 있습니다. 클라이언트는 x509certificate를 사용하여 서버에 자신을 인증하거나 sslstream이 설정된 후 사용자 이름과 비밀번호를 보낼 수 있습니다.

WCF는 System.IdentityModel 인증 목적을위한 네임 스페이스이지만 보기에 그것은 임의의 응용 분야에서 사용할 수 있습니다. 이 작업을 수행하는 방법에 대한 정보는 드문 일입니다 (또는 Google Foo는 오늘 약합니다).

그래서 내 질문은 다음과 같습니다. System.identityModel을 응용 프로그램과 통합하려면 어떻게해야합니까? 모든 클레임 세트 제품이 필요한지 확실하지 않지만 사용자가 Windows 계정 또는 기타 제공된 인증 메커니즘을 사용하는 경우에 로그인 할 수 있다면 좋을 것입니다. (불행히도 WCF로 전환 할 수는 없지만 필요한 경우 몇 가지 변경을 할 수는 있지만 사용자 정의 프로토콜을 사용해야합니다.)

도움이 되었습니까?

해결책

내 Google Foo는 실제로 약했습니다. 대답은 제 질문에서 링크 바로 뒤에 있습니다. 여기에 몇 가지 링크가 있습니다 이 블로그 누군가가 결국 같은 질문을하는 경우.

먼저 "그 주장이 세트 한 것"을 이해하려고 노력해야합니다.

그런 다음 클레임 세트의 출처를 알아야합니다.

이 지식으로 무장 한 것은 실제로 매우 간단 해집니다.

내가 올바르게 이해하면 기본 워크 플로는 다음과 같습니다.

  1. 클라이언트는 a SecurityToken 사용 a SecurityTokenProvider
  2. 클라이언트는 SecurityToken 사용 a SecurityTokenSerializer
  3. 서버는 SecurityToken 사용 a SecurityTokenSerializer
  4. 서버가 생성됩니다 IAuthorizationPolicys를 사용하고 있습니다 SecurityTokenAuthenticator
  5. 서버가 생성됩니다 AuthorizationContext ~에서 IAuthorizationPolicy에스
  6. 완료

예시:

// 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);

을 위한 X509SecurityTokens 사용 a X509SecurityTokenProvider/Authenticator. 을 위한 WindowsSecurityTokens가 있습니다 WindowsSecurityTokenAuthenticator 그러나 제공자는 아닙니다. 대신 사용하십시오 WindowsSecurityToken 건설자:

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

이것은 꽤 잘 작동합니다. 내가 지금까지 생략 한 유일한 것은 토큰 직렬화입니다. 이있다 SecurityTokenSerializer .NET 프레임 워크에 하나의 구현이있는 클래스 : WSSecurityTokenSerializer WCF와 함께 제공되는 클래스.

직렬화 UserNameSecurityToken모래 X509SecurityTokenS는 매력처럼 작동하지만 (사막화를 시도하지는 않았지만) WindowsSecurityTokenS는 시리얼 라이저에 의해 지원되지 않는 것 같습니다. 이것은 내가 이미 가지고있는 두 가지 인증 방법 (인증서와 사용자 이름/비밀번호)을 남겨주세요. AuthorizationContext 어쨌든, 나는 내가 가진 것을 고수 할 것이다 :)

다른 팁

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top