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

.net 在控制台应用程序中使用ClaimsAuthenticationManager,.net,authentication,claims-based-identity,claims,.net,Authentication,Claims Based Identity,Claims,我在玩4.5中的新东西,并编写了一个简单的控制台应用程序,该应用程序应该在新的基于声明的安全模型中检查一些东西。我已经创建了ClaimsAuthorizationManager和ClaimsAuthenticationManager的自定义实现,将它们添加到应用程序配置文件中,将AppDomain主体策略设置为windows主体,并且除了AuthenticationManager.Authentication方法被调用外,几乎所有操作都运行良好 正在按预期调用AuthorizationManag

我在玩4.5中的新东西,并编写了一个简单的控制台应用程序,该应用程序应该在新的基于声明的安全模型中检查一些东西。我已经创建了ClaimsAuthorizationManager和ClaimsAuthenticationManager的自定义实现,将它们添加到应用程序配置文件中,将AppDomain主体策略设置为windows主体,并且除了AuthenticationManager.Authentication方法被调用外,几乎所有操作都运行良好

正在按预期调用AuthorizationManager.CheckAccess

我想这是正确的行为,因为当运行console应用程序时,用户已经通过身份验证,无需在应用程序启动时进行身份验证。不过,我想根据存储在数据库中的配置文件转换一些声明。 当然,我可以手动操作并自己处理CurrentPrinciapal对象。然而,我想知道是否有办法强迫应用程序使用AuthManager为我做这件事

只是好奇:)

这里有两位经理。它们基本上什么都不做,只是为了设置断点而存在:)

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>

ClaimsAuthenticationManager
是WIF处理管道的一部分。 您可以从该类派生,以在此管道内提供声明转换。 无需显式调用
Authenticate
方法,因为它在基本实现中不做任何事情

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

引用msdn:

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


您可以阅读更多内容。

在控制台应用程序中,您必须像这样显式调用Authenticate()。在.NET4.5中,使用IdentityConfiguration。在.NET 4.0中,它应该是FederatedAuthentication.ServiceConfiguration.ClaimsAuthenticationManager

var cam = IdentityConfiguration.ClaimsAuthenticationManager;
Thread.CurrentPrincipal = cam.Authenticate
                                 ("http://badri/MyResource",
                                         incomingPrincipal);

煞费苦心地提供自己的CAM实现背后的想法是,您需要添加、修改STS令牌上的删除声明。您可以根据自己的数据库和此处的所有内容添加内容,并丰富基于STS(incomingPrincipal)声明创建的主体。

您可以添加一些代码示例和配置吗。我熟悉旧版本的Windows身份基础,但我仍然怀疑它是在独立控制台应用程序上使用的。我已经添加了您所要求的。实际上它什么都没做。正如我所说的,调用了AuthMgr,但AuthenticationMan没有(正如让admint期望的那样:)。我还发现奇怪的是,提供了一个配置元素来“配置”“默认”ClaimsAuthenticationProvider,但这样做实际上什么也做不了。我希望,如果这在默认情况下是WIF管道的一部分,那么提供我自己的实现并添加引用它的配置将在默认情况下实现它。否则,所有这些都是抽象的,我将代码放在进行转换的地方,但我仍然必须实现
PostAuthenticateRequest(..)
来调用它。我们错过了什么吗?我知道这一切。我只是想知道是否有办法强迫它在独立环境中使用。也许这毫无意义——我总是可以手动进行索赔转换,但我只是好奇而已。无论如何-thx:)
 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);
    }
}
var cam = IdentityConfiguration.ClaimsAuthenticationManager;
Thread.CurrentPrincipal = cam.Authenticate
                                 ("http://badri/MyResource",
                                         incomingPrincipal);