Dot-Net

在控制台應用程序中使用 ClaimsAuthenticationManager

  • September 30, 2012

我正在玩 4.5 中的新東西,並編寫了一個簡單的控制台應用程序,它應該檢查新的基於聲明的安全模型中的一些東西。我已經創建了 ClaimsAuthorizationManager 和 ClaimsAuthenticationManager 的自定義實現,將它們添加到應用程序配置文件中,將 AppDomain 主體策略設置為 Windows 主體,除了呼叫 AuthenticationManager.Authenticate 方法之外,幾乎所有東西都執行良好。

AuthorizationManager.CheckAccess 正在按預期呼叫。

我想這是正確的行為,因為在執行控制台應用程序時,使用者已經過身份驗證,並且無需在應用程序啟動時執行此操作。但是,我想根據 - 讓我們說儲存在數據庫中的配置文件來轉換一些聲明。當然,我可以手動完成並自己處理 CurrentPrinciapal 對象。但是我想知道是否有辦法強制應用程序使用 AuthManager 為我做這件事。

只是好奇:)

所以,這裡有兩個經理。他們基本上什麼都不做,只是為了設置斷點而存在:)

 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);
   }
}

在控制台應用程序中,您必須像這樣顯式呼叫 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) 的聲明創建的主體。

引用自:https://stackoverflow.com/questions/12253828