Использование ClaimsAuthenticationManager в консольном приложении

Я играл с новыми материалами в 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);
    }
}

Ответ 1

В консольном приложении вам нужно будет явно вызвать 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).

Ответ 2

ClaimsAuthenticationManager является частью конвейера обработки WIF. Вы можете получить этот класс для преобразования претензий внутри этого конвейера. Нет необходимости явно вызывать метод Authenticate, поскольку он ничего не делает в своей базовой реализации.

Чтобы получить этот метод, вам нужно интегрировать WIF с использованием приложения WCF или ASP.NET(может быть MVC).

Цитата msdn:

WIF также предоставляет разработчикам последовательный опыт программирования, независимо от того, предпочитают ли они создавать свои приложения в ASP.NET или в средах WCF.

Вы можете прочитать здесь.