【问题标题】:Using ClaimsAuthenticationManager in a console application在控制台应用程序中使用 ClaimsAuthenticationManager
【发布时间】:2012-09-03 20:45:38
【问题描述】:

我正在玩弄 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 Identity Foundation,但我仍然怀疑它是为独立控制台应用程序设计的。
  • 我已经添加了您要求的内容。它实际上并没有做任何事情。正如我所说的 AuthMgr 被调用,但 AuthenticationMan 不是(就像让 admint - 预期的那样:))
  • 我也觉得奇怪的是提供了一个配置元素来“配置”“默认”ClaimsAuthenticationProvider,但这样做实际上什么也没做。我希望如果这是默认情况下 WIF 管道的一部分,那么提供我自己的实现并添加引用它的配置将默认实现它。否则,所有这些都是抽象的,我将代码放在进行转换的地方,但我仍然必须实现 PostAuthenticateRequest(..) 来调用它。我们错过了什么吗?

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


【解决方案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 环境中构建应用程序。

    您可以阅读更多here

    【讨论】:

    • 我知道这一切。我只是想知道是否有办法强制它在独立环境中使用。也许这没有意义 - 我总是可以手动进行声明转换,但我只是好奇。无论如何-谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2017-07-04
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多