首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF数据服务( WIF 4.5);没有为POST请求设置主体

WCF数据服务( WIF 4.5);没有为POST请求设置主体
EN

Stack Overflow用户
提问于 2013-06-29 19:34:06
回答 1查看 988关注 0票数 0

在跟随Dominick的Pluralsight课程和博客WIF 4.5之后,我仍然无法解决问题。我使用WCF数据服务和基于索赔的授权使用WIF 4.5。

我的ClaimsAuthenticationManagerClaimsAuthorizationManager设置在web.config中:

代码语言:javascript
复制
<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的内容:

代码语言:javascript
复制
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中使用以下内容:

代码语言:javascript
复制
<serviceAuthorization principalPermissionMode="Always" impersonateCallerForAllOperations="true" impersonateOnSerializingReply="true" />

但是现在我得到了以下错误:

代码语言:javascript
复制
The service operation 'ProcessRequestForMessage' that belongs to the contract with the 'IRequestHandler' name and the 'http://tempuri.org/' namespace does not allow impersonation.
EN

回答 1

Stack Overflow用户

发布于 2013-07-01 08:54:29

问题得到解决,这是确保批处理请求使用WCF数据服务正确处理WIF 4.5的正确配置

代码语言:javascript
复制
<behavior>
  <serviceCredentials useIdentityConfiguration="true" />
  <serviceAuthorization principalPermissionMode="Always" impersonateOnSerializingReply="true" />
</behavior>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17384002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档