System.IdentityModel 자체 클라이언트 서버 응용 프로그램에서 사용하는 방법
-
22-07-2019 - |
문제
tcpclient/tcplistener 및 sslstream을 기반으로 간단한 클라이언트-서버 응용 프로그램이 있습니다. 클라이언트는 x509certificate를 사용하여 서버에 자신을 인증하거나 sslstream이 설정된 후 사용자 이름과 비밀번호를 보낼 수 있습니다.
WCF는 System.IdentityModel 인증 목적을위한 네임 스페이스이지만 보기에 그것은 임의의 응용 분야에서 사용할 수 있습니다. 이 작업을 수행하는 방법에 대한 정보는 드문 일입니다 (또는 Google Foo는 오늘 약합니다).
그래서 내 질문은 다음과 같습니다. System.identityModel을 응용 프로그램과 통합하려면 어떻게해야합니까? 모든 클레임 세트 제품이 필요한지 확실하지 않지만 사용자가 Windows 계정 또는 기타 제공된 인증 메커니즘을 사용하는 경우에 로그인 할 수 있다면 좋을 것입니다. (불행히도 WCF로 전환 할 수는 없지만 필요한 경우 몇 가지 변경을 할 수는 있지만 사용자 정의 프로토콜을 사용해야합니다.)
해결책
내 Google Foo는 실제로 약했습니다. 대답은 제 질문에서 링크 바로 뒤에 있습니다. 여기에 몇 가지 링크가 있습니다 이 블로그 누군가가 결국 같은 질문을하는 경우.
먼저 "그 주장이 세트 한 것"을 이해하려고 노력해야합니다.
그런 다음 클레임 세트의 출처를 알아야합니다.
이 지식으로 무장 한 것은 실제로 매우 간단 해집니다.
내가 올바르게 이해하면 기본 워크 플로는 다음과 같습니다.
- 클라이언트는 a
SecurityToken
사용 aSecurityTokenProvider
- 클라이언트는
SecurityToken
사용 aSecurityTokenSerializer
- 서버는
SecurityToken
사용 aSecurityTokenSerializer
- 서버가 생성됩니다
IAuthorizationPolicy
s를 사용하고 있습니다SecurityTokenAuthenticator
- 서버가 생성됩니다
AuthorizationContext
~에서IAuthorizationPolicy
에스 - 완료
예시:
// 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 사용 a X509SecurityTokenProvider
/Authenticator
. 을 위한 WindowsSecurityToken
s가 있습니다 WindowsSecurityTokenAuthenticator
그러나 제공자는 아닙니다. 대신 사용하십시오 WindowsSecurityToken
건설자:
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
이것은 꽤 잘 작동합니다. 내가 지금까지 생략 한 유일한 것은 토큰 직렬화입니다. 이있다 SecurityTokenSerializer
.NET 프레임 워크에 하나의 구현이있는 클래스 : WSSecurityTokenSerializer
WCF와 함께 제공되는 클래스.
직렬화 UserNameSecurityToken
모래 X509SecurityToken
S는 매력처럼 작동하지만 (사막화를 시도하지는 않았지만) WindowsSecurityToken
S는 시리얼 라이저에 의해 지원되지 않는 것 같습니다. 이것은 내가 이미 가지고있는 두 가지 인증 방법 (인증서와 사용자 이름/비밀번호)을 남겨주세요. AuthorizationContext
어쨌든, 나는 내가 가진 것을 고수 할 것이다 :)
다른 팁
기존 솔루션에 의견을 게시 할 명성이 없지만 솔루션에 나열된 블로그에 새 URL을 게시하고 싶습니다. 더 이상 작동하지 않기 때문입니다. 누군가가 이것을 의견으로 바꿀 수 있다면, 나는 많은 의무가 있습니다.