emd*_*zej 10 .net authentication claims-based-identity claims
我正在玩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);
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
并没有什么特别的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台应用程序中,您必须显式调用Authenticate().在.NET 4.5中,您使用IdentityConfiguration.在.NET 4.0中,它应该是FederatedAuthentication.ServiceConfiguration.ClaimsAuthenticationManager.
var cam = IdentityConfiguration.ClaimsAuthenticationManager;
Thread.CurrentPrincipal = cam.Authenticate
("http://badri/MyResource",
incomingPrincipal);
Run Code Online (Sandbox Code Playgroud)
想要提供自己的CAM实现的想法背后的想法是,您将想要从STS添加,修改对令牌的删除声明.您可以根据自己的数据库和所有内容添加内容,并根据STS(incomingPrincipal)的声明丰富创建的主体.
归档时间: |
|
查看次数: |
5355 次 |
最近记录: |