我需要使用WIF保护流式WCF net.tcp服务端点.它应该对我们的令牌服务器验证传入呼叫.该服务是流式传输的,因为它旨在传输大量数据.
这似乎是不可能的. 如果我无法绕过捕获物,我的圣诞节将被毁掉,我会在阴沟里喝水,而快乐的购物者则会越过我缓慢冷却的身体.手提箱严重,你们.
为什么这不可能?这是Catch-22.
在客户端上,我需要使用我从令牌服务器获取的GenericXmlSecurityToken创建一个通道.没问题.
// people around here hate the Framework Design Guidelines.
var token = Authentication.Current._Token;
var service = base.ChannelFactory.CreateChannelWithIssuedToken(token);
return service.Derp();
Run Code Online (Sandbox Code Playgroud)
我说"没问题"吗?Problemo.事实上,NullReferenceException
风格问题.
"兄弟,"我问框架,"你甚至无效检查吗?" 框架是沉默的,所以我拆开并发现了
((IChannel)(object)tChannel).
GetProperty<ChannelParameterCollection>().
Add(federatedClientCredentialsParameter);
Run Code Online (Sandbox Code Playgroud)
是异常的来源,并且GetProperty
呼叫正在返回null
.那么,WTF?事实证明,如果我打开Message安全性并将客户端凭据类型设置为,IssuedToken
那么此属性现在存在于ClientFactory
(protip:IChannel中没有"SetProperty"等效,即混蛋).
<binding name="OMGWTFLOL22" transferMode="Streamed" >
<security mode="Message">
<message clientCredentialType="IssuedToken"/>
</security>
</binding>
Run Code Online (Sandbox Code Playgroud)
甜.没有更多的NRE.然而,现在我的客户在出生时出现了故障(仍然爱他,所以).通过WCF诊断进行挖掘(protip:让你的最坏的敌人在击碎它们并在你面前驾驶它们之前做到这一点,但在享受他们的女人和孩子的悲伤之前),我看到它是因为服务器和客户端之间的安全性不匹配.
'net.tcp:// localhost:49627/MyService'不支持请求的升级.这可能是由于绑定不匹配(例如在客户端而不是在服务器上启用安全性).
检查主机的诊断(再次:压碎,驱动,读取日志,享受哀叹),我看到这是真的
协议类型application/ssl-tls已发送到不支持该类型升级的服务.
"好吧,自我,"我说,"我只是打开主机上的Message安全性!" 我做到了. 如果你想知道它的样子,它就是客户端配置的精确副本.抬头.
结果: Kaboom.
绑定('NetTcpBinding',' http://tempuri.org/ ')支持不能与消息级安全性一起配置的流.考虑选择不同的传输模式或选择传输级别安全性.
因此,我的主机不能通过令牌进行流式传输和保护.第二十二条军规.
tl; dr:如何使用WIF保护流式net.tcp WCF端点???
我一直在使用JWT库来解码Json Web Token,并希望切换到Microsoft的官方JWT实现System.IdentityModel.Tokens.Jwt.
文档非常稀疏,所以我很难弄清楚如何完成我在JWT库中所做的工作.使用JWT库,有一个Decode方法,它采用base64编码的JWT并将其转换为JSON,然后可以对其进行反序列化.我想使用System.IdentityModel.Tokens.Jwt做类似的事情,但经过大量的挖掘,无法弄清楚如何.
为了它的价值,我正在从cookie中读取JWT令牌,以便与Google的身份框架一起使用.
任何帮助,将不胜感激.
我已经安装了Windows Identity Foundation但找不到Microsoft.IdentityModel dll.根据Azure Hands-on-Labs,它应该只是在VS2010的Add Reference中.但它并不存在.
我还查看了c:\ Program Files(x86)\ Windows Identity Foundation*并且它不在那里(或64位程序文件文件夹).
救命!
这些是用于Microsoft服务单点登录的众多技术和流行语.
有人可以解释ADFS,WIF,WS联合,SAML和STS(安全令牌服务),包括每个使用的位置和时间.
我正在尝试创建类似的东西:客户端验证并从自定义STS1获取令牌,下一个客户端使用机器密钥授权并在自定义STS2上获得令牌并获取另一个令牌.使用最后一个令牌,客户端请求RP服务上的方法.
所有服务都托管在IIS上,并且正在使用活动联合方案.两个STS都有ws2007Federation和ws2007Http绑定的端点,RP使用ws2007FederationBinding和STS2作为发行者.
如果我使用CreateChannelWithIssuedToken创建通道,我只能看到来自STS1的令牌,并且无法从STS2获取令牌.
所以我决定将STS1中的令牌作为ActAs RST的属性传递给STS2令牌.那失败了 - 无法解密令牌.
我需要在SharePoint 2010中为声明用户执行搜索模拟.为了说明这一点,我想首先说明如何使用Windows帐户,然后讨论Claims/WIF.
我可以使用以下方法为"经典"Windows集成身份验证用户执行此操作:
WindowsImpersonationContext wic = null;
try
{
WindowsIdentity impersonatedUser = new WindowsIdentity("john.doe@mydomain");
wic = impersonatedUser.Impersonate();
// do impersonated work here...
// in my case this is a SharePoint KeywordQuery
}
finally
{
if (wic != null)
{
wic.Undo();
}
}
Run Code Online (Sandbox Code Playgroud)
为了使上述功能得以实现,模拟帐户必须与当前用户位于同一个域中,我必须确保应用程序池所有者是:
(注意:如果有人可以弄清楚如何解决当前帐户必须与模拟帐户位于同一域中的问题,我很满意.)
我想对Claims/WIF帐户做同样的事情.这些帐户并不一定与AD帐户(我需要承担他们不是)相关联.
有没有办法告诉STS我想冒充某个特定帐户并为它提供该帐户的相应令牌?我没有我冒充用户的密码.
引用SharePoint Brew我必须应对在SharePoint Web前端(WFE)上运行的代码,该代码通过WCF调用调用查询处理器.我希望WCF调用位于模拟用户的上下文中.
WFE(Server1)搜索Web部件与服务应用程序代理进行通信.关联的搜索服务应用程序代理调用本地STS以获取用户的SAML令牌.收集SAML令牌后,搜索服务应用程序代理将通过WCF调用调用运行查询处理器的服务器.我将这个服务器称为"服务器2".服务器2接收传入请求并根据其本地STS验证SAML令牌.经过验证,Server 2连接到各种组件以收集,合并和安全性修剪搜索结果.服务器2将修剪后的搜索结果发送回服务器1,然后将其呈现给用户.
更多的研究使我看到ActAs和OnBehalfOf.我相信我会想要使用OnBehalfOf,但我不确定是否会有效.我发现的一些参考文献列在下面.任何指导表示赞赏.
我正在使用WIF(.net 4.5)和Azure Active目录进行身份验证.该网站将位于Azure上.
一切都在本地工作,但是当我把它放到azure上时我得到错误:
数据保护操作失败.这可能是由于没有为当前线程的用户上下文加载用户配置文件引起的,这可能是线程模拟时的情况.
我理解这是因为应用程序无法使用DAPI,因此我需要切换到使用MAC保护我的应用程序.
在本地我把它添加到我的webconfig: -
<securityTokenHandlers>
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</securityTokenHandlers>
Run Code Online (Sandbox Code Playgroud)
正如文档中所建议的,我添加了一个静态机器密钥,但我找不到关于密钥长度的任何建议 - 所以我假设256.
但是,此配置只会出现此错误:
[CryptographicException:加密操作期间发生错误.] System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func,Byte [] input)+115 System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(Byte [] protectedData)+59 System.Web.Security.MachineKey.Unprotect(ICryptoServiceProvider cryptoServiceProvider,Byte [] protectedData,String []用途)+62 System.Web.Security.MachineKey.Unprotect(Byte [] protectedData,String []用途)+ 122 System.IdentityModel.Services.MachineKeyTransform.Decode(Byte [] encoded)+161 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte [] cookie,Boolean outbound)+123 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader) ,SecurityTokenResolver tokenResolver)+575 System.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte [] token,SecurityTokenResolver tokenResolver)+76 System.IdentityModel.Services.SessionAuthenticationMod ule.ReadSessionTokenFromCookie(Byte [] sessionCookie)+833 System.IdentityModel.Services.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken&sessionToken)+186 System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest(Object sender,EventArgs eventArgs)+210 System.Web.SyncEventExecutionStep. System.Web.HttpApplication.IExecutionStep.Execute()+ 136 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)+69
我删除了machinekey部分,因为我没有指定格式正确的密钥,但错误不会消失.
什么是战斗WIF!
我们有一个使用WIF的ASP.NET应用程序.我们的web.config文件有一个这样的部分:
<audienceUris>
<add value="https://someapp.mycompany.com/App/" />
</audienceUris>
<federatedAuthentication>
<wsFederation passiveRedirectEnabled="true" issuer="https://adfs.mycompany.com/adfs/ls/" realm="https://someapp.mycompany.com/App/" requireHttps="true" />
<cookieHandler requireSsl="false" />
</federatedAuthentication>
Run Code Online (Sandbox Code Playgroud)
每个例子中,我看到两个audienceUris
和realm
值是相同的.这两者有什么区别?我们俩都需要它们吗?
MVC 5中"内部部署权限认证"所需的元数据文档是什么?
我应该提供它的URL,以便在MVC 5中为内部部署选项设置组织帐户身份验证,但我是Web开发的新手,并且不知道它在这里寻找什么.
任何帮助在这里将不胜感激.
仅供参考:我正在尝试使用内部Active Directory.
我在字符串中有一个SAML令牌:
<saml:Assertion xmlns:saml="..." ...> ..etc... </>
Run Code Online (Sandbox Code Playgroud)
在HttpModule中,我想将其转换为ClaimsPrincipal,以便我的服务可以将通常的Thread.CurrentPrincipal作为IClaimsPrincipal来完成.
我找到了一些诱人的网页/博客/等...看起来很有帮助:
我实际上试图将SAML令牌转换为ClaimsPrincipal(通过SecurityToken中间步骤或直接...以任何方式开心).Cibrax的想法中的示例代码使用以下内容进行关键验证和反序列化步骤:
SecurityTokenSerializer securityTokenSerializer
= new SecurityTokenSerializerAdapter(
FederatedAuthentication.SecurityTokenHandlers,
MessageSecurityVersion.Default.SecurityVersion,
false, new SamlSerializer(), null, null);
SecurityToken theToken
= WSFederationAuthenticationModule.GetSecurityToken(
theSamlTokenInStringForm, securityTokenSerializer);
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,WIF的RTM版本没有公开GetSecurityToken的这个重载...它只暴露:
WSFederationAuthenticationModule fam = new WSFederationAuthenticationModule();
SecurityToken theToken = fam.GetSecurityToken(HttpRequest theRequest);
SecurityToken theToken = fam.GetSecurityToken(SignInResponseMessage message);
Run Code Online (Sandbox Code Playgroud)
谢谢你帮我搞砸了!
泰勒