13

TcpClient/TcpListenerとSslStreamに基づく単純なクライアントサーバーアプリケーションがあります。クライアントは、X509Certificateを使用するか、SslStreamの確立後にユーザー名とパスワードを送信することにより、サーバーに対して自身を認証できます。

WCFは認証の目的でSystem.IdentityModel名前空間を使用しますが、これ任意のアプリケーションで使用できるようです。これは興味深いことです。ただし、これを行う方法に関する情報はまばらです(または私のGoogle fooは今日弱いです)。

したがって、私の質問は、System.IdentityModelをアプリケーションと統合するために何をする必要があるかということです。すべてのClaimSetが必要かどうかはわかりませんが、ユーザーがWindowsアカウントまたはその他の提供されている認証メカニズムを使用してログインできると便利です。(残念ながら、WCFに切り替えるだけでなく、カスタムプロトコルを使用する必要がありますが、必要に応じて変更を加えることができます。)

4

2 に答える 2

17

私のGoogle fooは確かに弱かった。答えは私の質問のリンクのすぐ後ろにあります。したがって、誰かが最終的に同じ質問をする場合に備えて、このブログへのリンクをいくつか示します。

まず、「そのクレーム セットのもの」を理解しようとする必要があります。

次に、クレーム セットがどこから来たのかを知る必要があります。

この知識があれば、実際には非常に簡単になります。

私の理解が正しければ、基本的なワークフローは次のようになります。

  1. クライアントは をSecurityToken使用して を作成しますSecurityTokenProvider
  2. クライアントはSecurityTokenSecurityTokenSerializer
  3. サーバーはSecurityTokenSecurityTokenSerializer
  4. サーバーはIAuthorizationPolicyを使用して を作成しますSecurityTokenAuthenticator
  5. サーバーは から作成AuthorizationContextIAuthorizationPolicyます
  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 には / を使用しX509SecurityTokenProviderますAuthenticatorWindowsSecurityTokens にはWindowsSecurityTokenAuthenticatorプロバイダーはありますが、プロバイダーはありません。代わりに、WindowsSecurityTokenコンストラクターを使用します。

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

これは非常にうまく機能します。上記で省略したのは、トークンのシリアル化だけです。SecurityTokenSerializer.NET フレームワークに 1 つの実装を持つクラスがあります。WSSecurityTokenSerializerそれは、WCF に付属するクラスです。

UserNameSecurityTokens とs のシリアルX509SecurityToken化は魅力的ですが (逆シリアル化は試していません)、WindowsSecurityTokens は明らかにシリアライザーでサポートされていません。これにより、既に持っている 2 つの認証方法 (証明書とユーザー名/パスワード) が残りますが、とにかくそれを望まなかったのでAuthorizationContext、私が持っているものを使い続けます :)

于 2009-03-14T22:14:39.040 に答える
7

既存のソリューションにコメントを投稿する評判はありませんが、ソリューションにリストされているブログに新しい URL を投稿したいと思います。これらのブログは機能しなくなったためです。誰かがこれをコメントに変更できる場合は、私は非常に義務付けられます.

于 2013-02-07T10:01:10.910 に答える