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

10

我在尝试使用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);
    }
}

请您添加一些代码示例和配置信息。我熟悉旧版的Windows身份基础,但我仍然怀疑它是否设计用于独立的控制台应用程序。 - Grzegorz W
我已经添加了你要求的内容。实际上它什么也没做。正如我所说,AuthMgr被调用了,但AuthenticationMan没有被调用(就像让管理员 - 预期的那样 :))。 - emdzej
我也觉得很奇怪,提供了一个配置元素来“配置”“默认”的ClaimsAuthenticationProvider,但实际上并没有做任何事情。我期望如果这是默认的WIF管道的一部分,那么提供自己的实现并添加引用它的配置将使其默认实现。否则,所有这些只是抽象出我放置执行转换代码的位置,但我仍然必须实现PostAuthenticateRequest(..)来调用它。我们是否遗漏了什么? - JoeBrockhaus
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)的声明创建的主体。

1

ClaimsAuthenticationManager 是 WIF 处理管道的一部分。 您可以从此类派生,以在此管道内提供声明转换。 由于其基本实现中什么也不做,因此无需显式调用 Authenticate 方法。

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

引用 msdn:

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

您可以在 这里 阅读更多信息。


我知道这些。我只是想知道是否有一种方法可以强制它在独立环境中使用。也许这没有意义 - 我总是可以手动进行索赔转换,但我只是好奇。无论如何 - 谢谢 :) - emdzej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接