在第一个方法中,多亏了Dominick Baier的贡献,我想出了一个习惯ClaimsAuthorizationManager
。似乎可以使用 WIF 作为解决方案。
- 仍然不知道 WIF 是否最适合。
- 还有一个问题是否可以在客户端和服务器端之间共享授权逻辑。还没想好。
还有这篇关于类似问题的帖子。
我想到的第一件事就是像这样检查访问权限:
authorizationManager.CheckAccess("show_subresources", "resource_org_id", "20d55788-bf46-43f0-b6c5-ccb6be687b90");
我正在检查访问权限。至于在方法ClaimsPrincipalPermission(....)
上方带有属性 [ ] 的声明性方法,这在我们的案例中似乎不起作用,因为在获取资源之前,resource_organization_id 是未知的。管理器的第一个方法版本如下所示:
public class AuthorizationManager : ClaimsAuthorizationManager
{
public const string ActionType = "http://application/claims/authorization/action";
public const string ResourceType = "http://application/claims/authorization/resource";
public override bool CheckAccess(AuthorizationContext context)
{
//logic
return false;
}
public bool CheckAccess(string action, params string[] resources)
{
var principal = Thread.CurrentPrincipal as ClaimsPrincipal;
var context = CreateAuthorizationContext(
principal,
action,
resources
);
return CheckAccess(context);
}
private AuthorizationContext CreateAuthorizationContext(ClaimsPrincipal principal, string action, params string[] resources)
{
var actionClaims = new Collection<Claim>
{
new Claim(ActionType, action)
};
var resourceClaims = new Collection<Claim>();
if (resources != null && resources.Length > 0)
{
resources.ToList().ForEach(ar => resourceClaims.Add(new Claim(ResourceType, ar)));
}
return new AuthorizationContext(
principal,
resourceClaims,
actionClaims);
}
}
请注意,我正在使用 .Net 4.0 的Microsoft.IdentityModel
nuget 包。
管理器应该通过 app.config 文件实现:
<configuration>
<configSections>
<section name="microsoft.identityModel" type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.identityModel>
<identityConfiguration>
<claimsAuthorizationManager type="ClaimsAuthorizationJustATry.AuthorizationManager, ClaimsAuthorizationJustATry"/>
</identityConfiguration>
</system.identityModel>
</configuration>
但我是这样做的:
FederatedAuthentication.ServiceConfiguration.ClaimsAuthorizationManager = new AuthorizationManager();