WCF4.0的模WCF其余的入门工具包的RequestInterceptor?
-
14-11-2019 - |
题
不WCF4.0有一个模拟舱/模块/无论WCF其余的入门工具包的RequestInterceptor?
解决方案
没有任何映射1-1的任何映射到它,但您可以使用WCF核心的IdispatchMessageSpector实现RequestIspector将要做的大多数方案。帖子在 http://博客.msdn.com/b/carlosfigueira/archive/2011/04/19/19/wcf-extorys-message-inspectors.aspx 有一些关于消息检查员的详细信息。
其他提示
我回到了更新。
我碰巧在代码中重视简单,并且在成功解决此问题之后,我不能说我更喜欢它多于查询字符串方法。将单个呼叫丢弃到每个服务端点,伴随着Authz方法似乎比有些人可能相信的更容易。
无论如何,足够的意见......解决方案。解决方案是正确的,在此链接上的Stackoverflow下方,但在我们的背景下没有很好地描述...所以我将为这里找到的示例代码提供“User634119”的信用: 标题在OperationContext中 首先,我们需要向我们的web.config文件添加一个servicebehavior:
<behaviors>
<serviceBehaviors>
<behavior>
<serviceAuthenticationManager serviceAuthenticationManagerType="WCF.BasicAuthorization, WCF"></serviceAuthenticationManager>
<serviceAuthorization impersonateCallerForAllOperations="false" principalPermissionMode="Custom" serviceAuthorizationManagerType="WCF.BasicAuthentication, WCF">
</serviceAuthorization>
</behavior>
</serviceBehaviors>
</behaviors>
.
next make:serviceBehaviors块中引用的课程(称为BasicAuthorization):
//Authorize the call against the URI resource being requested...
public class BasicAuthorization : ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext,
ref Message message)
{
//some code
}
}
.
next制作身份验证类:
// Authenticate the header signature as described in my previous post
public class BasicAuthentication : ServiceAuthenticationManager
{
public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri,
ref Message message)
{
//some code
}
}
.
在验证方法中,使用httprequestmessageproperty将请求头详细信息拉出并执行我第一次回复中描述的相同的3个步骤。
爱德华,你问:@carlosfigueira:我可以用它来实现一个身份认证系统?
我的工作上,同样的问题,并有至少一个解决方案(如下所述)为你和一个即将到来的授权标题一(我相信是你在想的"拦截").
最简单的办法,以确保WCF4其余WebHttp编程模型基于端点是这样的:
- 问题的一个共同的秘密钥和API关键每个客户使用,作为凭据。API关键是真的相同的用户名。
- 运行的所有endspoints SSL保证你总是有道/信息/数据安全
- 需要的客户使用的共用秘密生成HMAC-SHA1(或当量)的散列签名字符串中包括一个时间戳和他们的API关键。
- 要求客户将所有3的这些作为查询参数字符串 在每一个请求:
- 签名
- 时间戳
- API关键
- 例如: https://127.0.0.1/RestEndpoint?Sig={sigString}&ApiKey={apiKey}&TimeStamp={时间戳}&所有其他参数,在这里...
- 在你的服务方面,实施一种认证方法,需要所有3弦,然后:
- 看起来API关键和返回的客户共享的秘密 你的 已在一个数据库或其他地方。
- 比较的时间戳止日期时间。现在,以确保请求不超过15分钟的老抵御重的攻击。
- 使用这3个字符串,重新创建的签名字符串和比较你到一个过在的客户。
- 如果它们匹配,请求方是真实的。
现在,更好的方式来做到这一点是通过使用HTTP授权请求头储存的那些3串并有一个全球拦截上下的进程的看所有请求。这将防止潜在的暴露端点没有一个认证块(嗯,至少它的可能性较小或许).
问题与使用的查询串开展所有这些信息查询串具有2k最大的长度(变化的客户机/浏览器)和查询串变得真的很难读时调试...但是,仅仅获得用到它。
一些认为一个更复杂的方式做到这一点的是STS模型,其中你要求客户来通过这3个身份验证串到一个安全标服务的终点。响应消息会通过后一届会议标记的客户将通过在每个呼吁在替代的3串。这是真的,对客户没有必要产生一个HMAC哈希上的签名的每一个电话,但是服务器方仍然必须进行认证的标记和本届会议的概念,犯规了清洁宁静的无国籍行为。
我将尽我最后码块,实现这两个查询串并且认证标题的方法。