10

私は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);
    }
}
4

2 に答える 2

5

コンソール アプリでは、このように Authenticate() を明示的に呼び出す必要があります。.NET 4.5 では、IdentityConfiguration を使用します。.NET 4.0 では、FederatedAuthentication.ServiceConfiguration.ClaimsAuthenticationManager でした。

var cam = IdentityConfiguration.ClaimsAuthenticationManager;
Thread.CurrentPrincipal = cam.Authenticate
                                 ("http://badri/MyResource",
                                         incomingPrincipal);

CAM の独自の実装を提供するという苦労の背後にあるアイデアは、STS からのトークンに対する要求を追加、変更、または削除することです。データベースとそのすべてに基づいて独自のロジックを追加し、STS (incomingPrincipal) からの要求に基づいて作成されたプリンシパルを充実させることができます。

于 2012-09-30T14:03:41.497 に答える
1

ClaimsAuthenticationManagerWIF 処理パイプラインの一部です。このクラスから派生して、このパイプライン内でクレーム変換を提供できます。Authenticate基本実装では何もしないため、メソッドを明示的に呼び出す必要はありません。

このメソッドを呼び出すには、WIF を WCF または ASP.NET アプリケーション (MVC の場合もあります) と統合する必要があります。

msdn の引用:

また、WIF は、開発者が ASP.NET または WCF 環境でアプリケーションを構築することを選択した場合でも、一貫したプログラミング エクスペリエンスを開発者に提供します。

詳しくはこちらをご覧ください

于 2012-09-04T18:46:09.163 に答える