私は4.5で新しいものをいじっていて、新しいクレームベースのセキュリティモデルでいくつかのことをチェックすることになっている単純なコンソールアプリケーションを作成しました。ClaimsAuthorizationManagerとClaimsAuthenticationManagerのカスタム実装を作成し、それらをアプリケーション構成ファイルに追加し、AppDomainプリンシパルポリシーをWindowsプリンシパルに設定しました。ほとんどすべてが、AuthenticationManager.Authenticateメソッドが呼び出されることを除いて正常に機能します。
AuthorizationManager.CheckAccessが期待どおりに呼び出されています。
コンソールアプリを実行しているとき、ユーザーはすでに認証されており、アプリの起動時にそれを行う必要がないため、これは正しい動作だと思います。ただし、データベースに保存されているプロファイルに基づいて、いくつかのクレームを変換したいと思います。もちろん、手動で実行して、CurrentPrinciapalオブジェクトを自分で処理することもできます。ただし、アプリにAuthManagerを使用して強制的に実行させる方法があるかどうか疑問に思っていました。
ただ好奇心が強い:)
それで、ここに2人のマネージャーがいます。それらは基本的に何もせず、ブレークポイントを設定するためだけに存在します:)
public class AuthorizationManager : ClaimsAuthorizationManager
{
public override bool CheckAccess(AuthorizationContext context)
{
return base.CheckAccess(context);
}
}
public class Authenticationmanager : ClaimsAuthenticationManager
{
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
}
App.configは次のようになります。
<configuration>
<configSections>
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.identityModel>
<identityConfiguration>
<claimsAuthenticationManager type="ClaimsSandbox.Authenticationmanager, ClaimsSandbox"/>
<claimsAuthorizationManager type="ClaimsSandbox.AuthorizationManager, ClaimsSandbox"/>
</identityConfiguration>
</system.identityModel>
</configuration>
そして、特別なことを何もしないコード:
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var principal = Thread.CurrentPrincipal;
DescribeMe(principal);
ClaimsPrincipalPermission.CheckAccess("foo ", "bar");
Console.ReadLine();
}
private static void DescribeMe(System.Security.Principal.IPrincipal principal)
{
Console.WriteLine(principal);
var claimsPrincipal = principal as ClaimsPrincipal;
claimsPrincipal.IsInRole("Foo");
Console.WriteLine(claimsPrincipal.Identity.IsAuthenticated);
}
}