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

时间:2012-09-03 20:45:38

标签: .net authentication claims-based-identity claims

我正在玩4.5中的新东西并写了一个简单的控制台应用程序,它应该检查基于新索赔的安全模型中的一些东西。我创建了ClaimsAuthorizationManager和ClaimsAuthenticationManager的自定义实现,将它们添加到应用程序配置文件中,将AppDomain主体策略设置为windows principal,除了调用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 个答案:

答案 0 :(得分: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)的声明丰富创建的主体。

答案 1 :(得分:0)

ClaimsAuthenticationManager是WIF处理管道的一部分。 您可以从此类派生,以在此管道中提供声明转换。 没有必要明确调用Authenticate方法,因为它在它的基本实现中什么都不做。

要调用此方法,必须将WIF与WCF或ASP.NET应用程序集成(可以是MVC)。

引用msdn:

  

WIF还为开发人员提供了一致的编程体验,无论他们选择在ASP.NET还是在WCF环境中构建应用程序。

您可以阅读更多here