Использование 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);
    }
}

2 ответа

Решение

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

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

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

Цитируя MSDN:

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

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

Другие вопросы по тегам