在跟随Dominick的Pluralsight课程和博客WIF 4.5之后,我仍然无法解决问题。我使用WCF数据服务和基于索赔的授权使用WIF 4.5。
我的ClaimsAuthenticationManager和ClaimsAuthorizationManager设置在web.config中:
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
...
<system.identityModel>
<identityConfiguration>
<claimsAuthenticationManager type="Magnum.WCFDataService.ClaimsTransformer, Magnum.WCFDataService" />
<claimsAuthorizationManager type="Magnum.WCFDataService.AuthorizationManager, Magnum.WCFDataService" />
</identityConfiguration>
</system.identityModel>以下是我的AuthorizationManager的内容:
public class AuthorizationManager : ClaimsAuthorizationManager
{
public override bool CheckAccess(AuthorizationContext context)
{
var action = context.Action.First();
if (action.Type.Equals(ClaimPermission.ActionType))
{
var resource = context.Resource.First();
return context.Principal.HasClaim(resource.Value, action.Value);
}
return base.CheckAccess(context);
}
}我遇到的第一个问题是,WCF为每个请求自动调用我的AuthorizationManager,并传入用于操作的http谓词和资源的URL,因为我想手动确定何时使用数据服务提供的查询和更改拦截器调用声明。这就是我发现Dominick的解释问题的地方,建议编写一个自定义类和属性来替换ClaimsPrincipalPermission。这样做很好,该属性位于change和query拦截器上,并使用自定义URI再次调用我的AuthorizationManager。
现在,问题是,对于GET请求,它的工作没有任何问题。WCF调用AuthorizationManager一次,我忽略它,第二次使用我处理的属性。但是,对于POST请求(无论何时我有一个变更拦截器),当第二次使用我的URI调用AuthorizationManager时,上下文中的主体是GenericPrincipal而不是ClaimsPrincipal,并且不包含需要检查的声明。
如何确保每次调用ClaimsPrincipal时总是得到ClaimsTransformer (ClaimsAuthenticationManager)生成的AuthorizationManager?
的进一步信息经过一些密集的谷歌搜索,我已经缩小了问题。只有当我从客户端调用GenericPrincipal方法时使用SaveChangesOptions.Batch时,我才会看到SaveChanges。如果我不发送批处理更新,我将得到一个正常的ClaimsPrincipal。因此,新的问题;如何保留ClaimsPrincipal进行批处理更新?
我在MSDN线程(http://social.msdn.microsoft.com/Forums/en-US/35eb817d-363c-4a94-b9eb-351cd0d8567f/batch-update-and-impersonation-current-user)上发现了一些信息,说明我需要在web.config中使用以下内容:
<serviceAuthorization principalPermissionMode="Always" impersonateCallerForAllOperations="true" impersonateOnSerializingReply="true" />但是现在我得到了以下错误:
The service operation 'ProcessRequestForMessage' that belongs to the contract with the 'IRequestHandler' name and the 'http://tempuri.org/' namespace does not allow impersonation.发布于 2013-07-01 08:54:29
问题得到解决,这是确保批处理请求使用WCF数据服务正确处理WIF 4.5的正确配置
<behavior>
<serviceCredentials useIdentityConfiguration="true" />
<serviceAuthorization principalPermissionMode="Always" impersonateOnSerializingReply="true" />
</behavior>https://stackoverflow.com/questions/17384002
复制相似问题