独自のクライアント/サーバーアプリケーションでSystem.IdentityModelを使用する方法
-
22-07-2019 - |
質問
TcpClient / TcpListenerおよびSslStreamに基づいた単純なクライアントサーバーアプリケーションがあります。クライアントは、X509Certificateを使用するか、SslStreamの確立後にユーザー名とパスワードを送信することにより、サーバーに対して自身を認証できます。
WCFは認証目的で System.IdentityModel 名前空間を使用しますが、見かけ上は、任意のアプリケーションで使用できます。これはおもしろそうです。しかし、これを行う方法に関する情報はまばらです(または、今日のGoogle fooは弱いです)。
だから、私の質問は次のとおりです。 System.IdentityModelをアプリケーションに統合するために何をする必要がありますか?ユーザーは、Windowsアカウントまたは提供されているその他の認証メカニズムを使用してログインできます。 (残念ながら、WCFに切り替えることはできませんが、カスタムプロトコルを使用する必要がありますが、必要に応じて変更できます。)
解決
私のGoogle fooは確かに弱かった。答えは私の質問のリンクのすぐ後ろです。誰かが最終的に同じ質問をした場合に備えて、このブログへのリンクをいくつか紹介します。 >
まず、「そのクレームセットのもの」を理解するようにしてください:
次に、クレームセットの出所を知る必要があります:
この知識で武装すると、実際には非常に簡単になります。
正しく理解できれば、基本的なワークフローは次のようになります。
- クライアントは、
SecurityTokenProvider
を使用して - クライアントは、
SecurityTokenSerializer
を使用して - サーバーは、
SecurityTokenSerializer
を使用して - サーバーは、
SecurityTokenAuthenticator
を使用して - サーバーは、
IAuthorizationPolicy
s から - 完了
SecurityToken
を作成します
SecurityToken
をシリアル化します
SecurityToken
をデシリアライズします
IAuthorizationPolicy
を作成します
AuthorizationContext
を作成します
例:
// 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
の場合は、 X509SecurityTokenProvider
/ Authenticator
を使用します。 WindowsSecurityToken
には WindowsSecurityTokenAuthenticator
がありますが、プロバイダーはありません。代わりに、 WindowsSecurityToken
コンストラクターを使用します。
var t = new WindowsSecurityToken(WindowsIdentity.GetCurrent());
これは非常にうまく機能します。ここまでで省略したのは、トークンのシリアル化だけです。 .NET Frameworkに1つの実装を持つ SecurityTokenSerializer
クラスがあります。WCFに付属する WSSecurityTokenSerializer
クラスです。
UserNameSecurityToken
sと X509SecurityToken
sのシリアル化はチャームのように機能しますが(デシリアライゼーションを試みていません)、 WindowsSecurityToken
sは明らかにサポートされていませんシリアライザー。これにより、既に持っている2つの認証方法(証明書とユーザー名/パスワード)が残ります。とにかく AuthorizationContext
が欲しくなかったので、私は持っているものに固執します:)
他のヒント
既存のソリューションにコメントを投稿する評判はありませんが、ソリューションにリストされているブログに新しいURLを投稿したいのですが、それらはもう機能しません。誰かがこれをコメントに変更できるなら、私は大いに喜んでいるでしょう。