独自のクライアント/サーバーアプリケーションで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. クライアントは、 SecurityTokenProvider
  2. を使用して SecurityToken を作成します
  3. クライアントは、 SecurityTokenSerializer
  4. を使用して SecurityToken をシリアル化します
  5. サーバーは、 SecurityTokenSerializer
  6. を使用して SecurityToken をデシリアライズします
  7. サーバーは、 SecurityTokenAuthenticator
  8. を使用して IAuthorizationPolicy を作成します
  9. サーバーは、 IAuthorizationPolicy s
  10. から AuthorizationContext を作成します
  11. 完了

例:

// 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を投稿したいのですが、それらはもう機能しません。誰かがこれをコメントに変更できるなら、私は大いに喜んでいるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top