WindowsIdentity を操作しようとしたことがありますか?
Pure C#/.Net、シリアライズ可能、および GetCurrent() は実行アカウントを返します。
セキュリティトークン
ユーザーは、リクエストに便乗して一連のクレームをアプリケーションに配信します。Web サービスでは、これらのクレームは SOAP エンベロープのセキュリティ ヘッダーで伝達されます。ブラウザー ベースの Web アプリケーションでは、クレームはユーザーのブラウザーから HTTP POST 経由で到着し、セッションが必要な場合は後で Cookie にキャッシュされる場合があります。セキュリティ トークンは、発行機関によってデジタル署名されたシリアル化されたクレームのセットです。署名は重要です。これにより、ユーザーが大量のクレームを作成して送信しただけではないことを保証できます。暗号化が必要ない、または望ましくないセキュリティの低い状況では、署名されていないトークンを使用できますが、それはこのホワイト ペーパーで取り上げるシナリオではありません。WIF のコア機能の 1 つは、セキュリティ トークンを作成して読み取る機能です。WIF と .NET Framework の基盤となる配管は、すべての暗号化の面倒な作業を処理し、読み取り可能な一連のクレームをアプリケーションに提示します。
Windows Identity Foundation のホワイトペーパーから引用
あなたの主な質問は:
「ログオン資格情報を使用してユーザーを認証する純粋な C#/.NET の方法はありますか?」
WindowsIdentity は、ドメイン コントローラーによって発行された認証トークンであり、現時点では最良のアプローチのように思えます。
最初に投稿したとき、私は WindowsIdentity についてほとんど知りませんでしたが、問題や制約に役立つと感じました。いろいろ読んで、やっとこのページにたどり着きました。
WIF の導入は一目瞭然です。WindowsIdentity は、Windows ベース/ロール ベースのセキュリティ問題のために設計された .NET フレームワークの新しいセットです。
SSPI、Kerberos は Windows 認証プロセス全体の一部であり、ユーザー/マシン/プロセスによって取得されたログオン トークンはドメイン コントローラーによって付与され、新しい WindowsIdentity オブジェクトを「単純に」インスタンス化するだけでは取得できません。この種の違法なインスタンス化が存在すると、Windows セキュリティ モデル全体 (ドメイン、UAC など) が機能しなくなります。
これは、「BUILTIN\Administrateurs」の一部でない場合に例外をスローする (非常に!) 小さなコンソール プログラムです (必要に応じてグループ名を変更してください)。「管理者として実行」するたびに、プログラムはエラーなしで終了します。
アクセス許可の非常に大きなセットがあり、すべての要求は要求ベースです (ID は xxx のメンバーですか?)
using System;
using System.Security;
using System.Security.Permissions;
using System.Security.Principal;
namespace WindowsIdentityTest
{
class Program
{
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
static string SomeServerAction()
{ return "Authenticated users can access"; }
[PrincipalPermission(SecurityAction.Demand, Role = "BUILTIN\\Administrateurs")]
static string SomeCriticalServerAction()
{ return "Only Admins can access"; }
static void Main(string[] args)
{
//This allows to perform security checks against the current Identity.
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
try
{
Console.WriteLine(SomeServerAction());
Console.WriteLine(SomeCriticalServerAction());
}
catch (SecurityException sec)
{
Console.WriteLine(string.Format("{0} : {1}\n------------\n{2}"
, sec.GetType()
, sec.Message
, sec.StackTrace));
}
catch (Exception ex)
{
Console.WriteLine("This shall not appen.");
}
Console.WriteLine("Press enter to quit.");
Console.ReadLine();
}
}
}
これが役立つことを願っています。