我正在使用Forms Authentication和ASP.NET MVC 2开发基于声明的授权系统.我看到一个名称空间"Microsoft.IdentityModel"提供了许多与其他"System.IdentityModel"相同的东西.
当功能看似重叠时,为什么这两个命名空间分开存在?
在过去的几天里,我一直在阅读关于Windows身份基础以及它如何如此优秀和灵活并且内置于.net 4.5的内容.尽管经历了几十个api,博客文章,操作方法等等,但我无法为我的生活做一个简单的实现工作.
我只使用Windows身份验证,我可以获取主体并查看随附的声明(这是每个示例似乎结束的地方).但是,我想将它们转换为有用的声明并缓存结果,以便每次请求都不会发生转换.
在我的web.config中,我有:
<configSections>
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
</configSections>
<system.identityModel>
<identityConfiguration>
<claimsAuthenticationManager type="SecurityProj.MyClaimsTransformationModule,SecurityProj" />
<claimsAuthorizationManager type="SecurityProj.MyClaimsAuthorizationManager,SecurityProj" />
</identityConfiguration>
</system.identityModel>
Run Code Online (Sandbox Code Playgroud)
但是,认证管理器永远不会被调用.我可以通过以下方式添加:
protected void Application_PostAuthenticateRequest()
{
ClaimsPrincipal currentPrincipal = ClaimsPrincipal.Current;
ClaimsTransformationModule customClaimsTransformer = new MyClaimsTransformationModule();
ClaimsPrincipal tranformedClaimsPrincipal = customClaimsTransformer.Authenticate(string.Empty, currentPrincipal);
HttpContext.Current.User = tranformedClaimsPrincipal;
}
Run Code Online (Sandbox Code Playgroud)
到我的global.asax.cs文件.它适用于第一个请求,但之后我得到"安全句柄已关闭"错误,并且不知道是什么导致它.显然,这不是正确的方法,所以有谁知道什么是最好或简单的工作实践?这只是用于Windows身份验证,我不需要比这更复杂的东西.
对于缓存,我试图使用:
SessionSecurityToken token = FederatedAuthentication.SessionAuthenticationModule
.CreateSessionSecurityToken(
currentPrincipal,
"Security test",
System.DateTime.UtcNow,
System.DateTime.UtcNow.AddHours(1),
true);
if (FederatedAuthentication.SessionAuthenticationModule != null &&
FederatedAuthentication.SessionAuthenticationModule.ContainsSessionTokenCookie(HttpContext.Current.Request.Cookies))
{
return;
}
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(token);
Run Code Online (Sandbox Code Playgroud)
但我也不确定那部分,转换问题需要先修复.
任何帮助,将不胜感激.只需要调用查找/转换和cookie集,谢谢.
我们的网站使用ADFS进行身份验证.为了减少每次请求的cookie有效负载,我们开启了IsSessionMode(请参阅节食中的fedauth cookies).
我们需要做的最后一件事就是在负载均衡的环境中实现这个功能,就是实现一个农场就绪的SecurityTokenCache.实现看起来非常简单,我主要想知道在处理SecurityTokenCacheKey以及TryGetAllEntries和TryRemoveAllEntries方法时是否存在任何问题(SecurityTokenCacheKey具有Equals和GetHashCode方法的自定义实现).
有没有人有这样的例子?我们计划使用AppFabric作为后备存储,但使用任何持久存储的示例将是有用的 - 数据库表,Azure表存储等.
以下是我搜索过的一些地方:
谢谢!
JD
3/16/2012更新 Vittorio的博客链接到使用新的.net 4.5内容的示例:
ClaimsAwareWebFarm 这个示例是对我们很多人的反馈的回答:你想要一个显示农场就绪会话缓存的示例(而不是tokenreplycache),这样你就可以通过引用而不是交换大的cookie来使用会话; 并且您要求一种更简单的方法来保护农场中的cookie.
我试图理解WIF中主动和被动联合之间的区别.如果依赖方(RP)是WCF服务而不是ASP.NET应用程序,则可以使用活动联合,如果RP是ASP.NET应用程序,则可以使用被动联合.这准确吗?
因此,在ASP.NET应用程序在后端使用WCF的情况下,MS文章建议使用ASP.NET应用程序使用ActAs STS获取的"引导"安全令牌,此令牌用于验证与WCF.在这种情况下,似乎我们正在组合Active(用户 - > STS - > ASP.NET RP)和被动(ASP.NET - > ActAs STS - > WCF)联合?
我正在构建一个应用程序,其中需求似乎是标准问题(至少对我来说)...我有一个基于asp .net mvc的Web.UI和来自iphone,andriod和blackberry的客户端.
因此,明智的做法是将我的所有业务逻辑移动到可以通过http访问的服务层.此服务层必须接受具有用户上下文(身份)的请求,并且以一种不错的方式执行授权,无论哪种类型的客户端与之通信(我希望?).
在一年多的时间里,我做了一个3个月的演出,在混合的内部部署和云架构中使用了WIF(Windows Identity Foundation).我喜欢它.引起共鸣的三件事是(1)外化认证而不关心如何完成,(2)从业务逻辑中删除授权逻辑,(3)基于声明的授权.
在过去的一年里,我听说并关注Rest Services的所有"酷炫的嬉皮士做事方式".所以我虽然很棒,但试试吧.在我开始玩游戏并获得编码之后,我开始变得非常困惑(并且随后在没有编写另一行c#的情况下阅读了大约10个小时).我仍然对所有SOAP vs REST,WS.*vs Http,SAML vs SWT babble感到困惑.我真的不希望这个线程是关于那个,因为有足够的说法在stackoverflow,但我觉得我有两个阵营之间的选择,当它不是真的感觉我想要一个或另一个但每个位?
对我来说,我上面提到的关于WIF的3点似乎并不像应该与WS绑定的概念.*?但是我感觉到他们,或者至少WIF现在是如何产生的,没有一些专家调整(例如我几天前才发现这篇文章 - http://zamd.net/2011/ 02/08/using-simple-web-token-swt-with-wif /).
我不太了解的其他领域是我的客户端(iphone,andriod,blackberry)能够玩WIF,是否是向他们抛出SAML令牌的STS,它们的行为就像浏览器一样并传回去在标题中就像任何其他客户端一样?是的,我必须要找出来,但如果这是WIF的交易破坏者,我发布后直接发现,那么至少我可以把注意力从它上面移开.
最后还要再加一点.我真的不想考虑这些.我想使用第三方身份验证/身份提供商 - http://www.janrain.com/products/engage - 我认为它使用OpenID.这可以适用于WIF还是我只是从OpenID创建一个新的SAML令牌并从那时起使用WIF.
我想在这个喋喋不休的结尾,我想回到我开始的地方,因为越来越复杂,我问的问题越多,我考虑的选择就越多.
是否有一个服务层(在WCF上)与不同的非.NET客户端进行通信,这些客户端需要身份上下文和授权如此奇怪?如果你已经建立了这样的东西,你是如何接近它的?
现在这很奇怪.在完成对.NET中基于声明的解决方案的一些研究后,发现不同的作者在实际谈论同一事件时引用.NET命名空间中的不同类.声明类(更不用说其他Identity,Principal,Manager,Helper类)在3个不同的命名空间中定义.
很明显,WIF是.NET 3.5和4.0的独立附加组件,它在4.5中被重写并成为核心的一部分.然而,它可以帮助明确指出用于新项目的类(因此端口到4.5之后可能更容易).还有其他人有关于这个问题的更多信息吗?
第一个链接:http://msdn.microsoft.com/en-us/library/ms572956(v = vs10)(System.IdentityModel.Claims名称空间)
第2名:http://msdn.microsoft.com/en-us/library/microsoft.identitymodel.claims.claim.aspx(Microsoft.IdentityModel.Claims)
第3名:(System.Security.Claims.Claim)
我发现这篇很好的文章展示了ASP.Net身份框架的演变:http: //www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity
但是,我对Windows身份框架(WIF)如何适应新的ASP.Net Identity Framework感兴趣.它们是另一组竞争的Microsoft实现吗?
此外,如果开发人员有兴趣支持SAML身份验证(WIF支持),Active Directory身份验证和表单身份验证,您会选择哪个?
注意:构建了一个github仓库以证明导致这些问题的问题.
在创建WIF安全WCF服务时,MSDN文档建议使用Visual Studio的身份和访问工具.在服务项目上运行该工具后,以下节点将添加到web.config [ commit 0472287 ]:
<ws2007FederationHttpBinding>
<binding name="">
<security mode="Message">
<message>
<issuerMetadata address="https://localhost/adfs/services/trust/mex" />
</message>
</security>
</binding>
</ws2007FederationHttpBinding>
Run Code Online (Sandbox Code Playgroud)
身份工具添加了不正确的issuerMetadata地址,根本不包括issure节点.值得庆幸的是,所有引用证书指纹的节点都是正确创建的.向此服务的客户端项目添加服务引用会导致客户端上的配置无效.在如下更改消息节点的内容后,创建对服务的服务引用会留下几乎可用的客户端(请参阅第二个问题)[ commit 758052d ].
<message>
<issuer address="https://localhost:44300/issue/wstrust/mixed/username" binding="ws2007HttpBinding" bindingConfiguration="" />
<issuerMetadata address="https://localhost:44300/issue/wstrust/mex" />
</message>
Run Code Online (Sandbox Code Playgroud)
第一个问题在设置导致绑定未正确配置的身份工具时,我做错了吗?生成的地址在STS FederationMetadata.xml文件中不存在,因此我不确定它的来源.
正确配置服务后,客户端的服务引用几乎即插即用.出于某种原因,它没有为WS2007FederationHttpBinding中的颁发者指定绑定配置.添加绑定并为WIF客户端创建绑定配置以获取令牌将导致客户端处于工作状态[ commit 39a4cbc ].
第二个问题更新服务web.config允许自动生成其余的客户端配置.我是否遗漏了客户端的内容以获得绑定自动配置?
所有这些缺少的元素都可以在IdentityMetadata.xml文件中查找,该文件是身份工具所需要的,以及两个项目都知道的FederationMetadata服务.似乎应该有一些东西可以使这些配置正确,而无需人工干预.
注意:构建了一个github仓库以证明导致这些问题的问题.
是否有使用WIF和ASP.NET MVC应用程序的示例应用程序?有人可以帮助我开始尝试集成这两种技术吗?
我们有一段代码创建了一个SigningCredentials对象,用于使用SHA256算法对xml文档进行签名.它完美适用于.NET 3.5.但是,当我们将代码库升级到.NET 4.5时,它会停止工作.相同的代码,相同的证书!我花了好几个小时在互联网上调试和搜索,没有任何运气.
谁能告诉我这里的问题是什么?先感谢您.
创建SigningCredentials的代码:
public SigningCredentials CreateSigningCredentials(X509Certificate2 cert)
{
var ski = new SecurityKeyIdentifier(new X509RawDataKeyIdentifierClause(cert));
return new SigningCredentials(new X509AsymmetricSecurityKey(cert), "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256", "http://www.w3.org/2001/04/xmlenc#sha256", ski);
}
Run Code Online (Sandbox Code Playgroud)
例外:
[CryptographicException: Invalid algorithm specified.
]
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr) +41
System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash, Int32 cbHash, ObjectHandleOnStack retSignature) +0
System.Security.Cryptography.Utils.SignValue(SafeKeyHandle hKey, Int32 keyNumber, Int32 calgKey, Int32 calgHash, Byte[] hash) +118
System.Security.Cryptography.RSACryptoServiceProvider.SignHash(Byte[] rgbHash, Int32 calgHash) +334
System.Security.Cryptography.RSAPKCS1SignatureFormatter.CreateSignature(Byte[] rgbHash) +321
System.IdentityModel.SignedXml.ComputeSignature(HashAlgorithm hash, AsymmetricSignatureFormatter formatter, String signatureMethod) +323
System.IdentityModel.SignedXml.ComputeSignature(SecurityKey signingKey) +690
System.IdentityModel.EnvelopedSignatureWriter.ComputeSignature() +338
System.IdentityModel.EnvelopedSignatureWriter.OnEndRootElement() …Run Code Online (Sandbox Code Playgroud) wif ×10
.net ×5
asp.net ×2
asp.net-mvc ×2
wcf ×2
.net-4.5 ×1
adfs ×1
architecture ×1
azure ×1
c# ×1
certificate ×1
sha256 ×1
signing ×1
soa ×1
web-farm ×1