我在尝试使用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);
}
}
PostAuthenticateRequest(..)
来调用它。我们是否遗漏了什么? - JoeBrockhaus