- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 IDP,它生成带有签名断言的 SAMLResponse。我不打算添加生成的 XML 文件的示例,因为它会使问题太长。但如果这真的有帮助,请告诉我,我会添加它。
SP 要求对断言进行加密并对响应进行签名,但目前情况并非如此。经过研究,我找不到如何去做,我会发布一些我尝试过的代码,但老实说我有点无能为力,我尝试的一切都没有成功。
问题是,我如何签署响应并加密断言?
以下是响应的创建和签名方式:
public class SAML
{
private const int tokenLifetime = 30;
private const string issuer = "https://some.domain/IdP";
private const string CertificateSerialNumber = "XXXXXXXXXXXXX";
private static string _RequestId;
private static string _RequestIssueInstant;
private static string _RequestProviderName;
private static string _RequestACS;
private static Dictionary<string, string> _claimDescriptors = new Dictionary<string, string>();
public static string CreateSamlResponse(string RequestId, string RequestIssueInstant, string RequestProviderName, string RequestACS, Dictionary<string,string> claimDescriptors)
{
_RequestId = RequestId;
_RequestIssueInstant = RequestIssueInstant;
_RequestProviderName = RequestProviderName;
_RequestACS = RequestACS;
_claimDescriptors = claimDescriptors;
var claims = CreateClaims();
var tokenHandler = new Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler();
var token = CreateToken(claims, tokenHandler);
return CreateSamlResponseXml(tokenHandler, token);
}
private static Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityToken CreateToken(IEnumerable<Microsoft.IdentityModel.Claims.Claim> claims,
Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler tokenHandler)
{
var descriptor = CreateTokenDescriptor(claims);
var token = tokenHandler.CreateToken(descriptor) as Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityToken;
AddAuthenticationStatement(token);
AddConfirmationData(token);
return token;
}
private static void AddConfirmationData(Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityToken token)
{
var confirmationData = new Microsoft.IdentityModel.Tokens.Saml2.Saml2SubjectConfirmationData
{
Recipient = new Uri(_RequestACS),
NotOnOrAfter = DateTime.UtcNow.AddSeconds(tokenLifetime),
InResponseTo = new Microsoft.IdentityModel.Tokens.Saml2.Saml2Id(_RequestId),
};
token.Assertion.Subject.SubjectConfirmations.Add(new Microsoft.IdentityModel.Tokens.Saml2.Saml2SubjectConfirmation(
Microsoft.IdentityModel.Tokens.Saml2.Saml2Constants.ConfirmationMethods.Bearer, confirmationData));
}
private static void AddAuthenticationStatement(Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityToken token)
{
var authenticationMethod = "urn:oasis:names:tc:SAML:2.0:ac:classes:Password";
var authenticationContext = new Microsoft.IdentityModel.Tokens.Saml2.Saml2AuthenticationContext(new Uri(authenticationMethod));
var authenticationStatement = new Microsoft.IdentityModel.Tokens.Saml2.Saml2AuthenticationStatement(authenticationContext);
token.Assertion.Statements.Add(authenticationStatement);
}
private static string CreateSamlResponseXml(Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityTokenHandler tokenHandler, Microsoft.IdentityModel.Tokens.Saml2.Saml2SecurityToken token)
{
var buffer = new StringBuilder();
using (var stringWriter = new StringWriter(buffer))
using (var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings()))
{
xmlWriter.WriteStartElement("Response", "urn:oasis:names:tc:SAML:2.0:protocol");
xmlWriter.WriteAttributeString("IssueInstant", DateTime.UtcNow.ToString("o"));
xmlWriter.WriteAttributeString("ID", "_" + Guid.NewGuid());
xmlWriter.WriteAttributeString("Version", "2.0");
xmlWriter.WriteStartElement("Status");
xmlWriter.WriteStartElement("StatusCode");
xmlWriter.WriteAttributeString("Value", "urn:oasis:names:tc:SAML:2.0:status:Success");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
tokenHandler.WriteToken(xmlWriter, token);
xmlWriter.WriteEndElement();
}
return buffer.ToString();
}
private static Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor CreateTokenDescriptor(IEnumerable<Microsoft.IdentityModel.Claims.Claim> claims)
{
var descriptor = new Microsoft.IdentityModel.Tokens.SecurityTokenDescriptor()
{
TokenType = Microsoft.IdentityModel.Tokens.SecurityTokenTypes.OasisWssSaml2TokenProfile11,
Lifetime = new Microsoft.IdentityModel.Protocols.WSTrust.Lifetime(DateTime.UtcNow, DateTime.UtcNow.AddMinutes(1)),
//AppliesToAddress = appliesTo,
AppliesToAddress = _RequestACS,
TokenIssuerName = issuer,
Subject = new Microsoft.IdentityModel.Claims.ClaimsIdentity(claims),
SigningCredentials = GetSigningCredentials()
};
return descriptor;
}
private static System.IdentityModel.Tokens.SigningCredentials GetSigningCredentials()
{
System.Security.Cryptography.X509Certificates.X509Certificate2 myCertificate = null;
X509Certificate2Collection selectedCerts = new X509Certificate2Collection();
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
foreach (System.Security.Cryptography.X509Certificates.X509Certificate2 cert in store.Certificates)
{
if (cert.SerialNumber.Trim().ToLower().Equals(CertificateSerialNumber.ToLower())){ myCertificate = cert; }
}
return new Microsoft.IdentityModel.SecurityTokenService.X509SigningCredentials(myCertificate, System.IdentityModel.Tokens.SecurityAlgorithms.RsaSha1Signature, System.IdentityModel.Tokens.SecurityAlgorithms.Sha1Digest);
}
private static IEnumerable<Microsoft.IdentityModel.Claims.Claim> CreateClaims()
{
foreach (var claimDescriptor in _claimDescriptors)
{
yield return new Microsoft.IdentityModel.Claims.Claim(claimDescriptor.Key, claimDescriptor.Value);
}
}
}
最佳答案
除了 SigningCredentials 属性之外,SecurityTokenDescriptor 和 Saml2SecurityToken 类还有一个 EncryptingCredentials 属性。设置它,断言将被加密。
签名响应可能更棘手。在获得带有加密断言的响应 xml 之后,您可以使用 SignedXml class为了这个目的。一个例子是 https://github.com/Safewhere/CHTestSigningService/blob/86a66950d1ffa5208b8bf80d03868a073ba29f12/Kombit.Samples.CHTestSigningService/Code/TokenSigningService.cs#L344
关于c# - 如何使用 C# 签署 SAMLResponse 和加密断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46529504/
给定以下 SAML 响应,我如何手动验证签名是否有效?我假设我应该依赖元数据中提供的 IDP 证书,而不是响应本身中的证书(尽管它们应该是相同的)。 有什么方法可以用 openssl 或 xmlsec
我已将我的网站与 TFIM 集成以实现 SSO。SSO 工作正常,但我无法在 SAMLResponse 中获得签名。它变得空了。但它已经存在于 SAMLResponse 中。当我试图从 samlres
基于 SAML sp 的身份验证具有以下简短的工作流程。 用户想在 sp 访问应用程序。 sp 将 SAMLRequest token 发送给 idp。 idp 使用它并生成 SAMLResponse
我有一个 IDP,它生成带有签名断言的 SAMLResponse。我不打算添加生成的 XML 文件的示例,因为它会使问题太长。但如果这真的有帮助,请告诉我,我会添加它。 SP 要求对断言进行加密并对响
我正在运行 Shibboleth SSO 登录页面,当我成功验证自己时,它会使用 SAMLResponse 字符串执行 POST,该字符串包含对我的 .NET MVC 应用程序的 base-64 编码
我是一名大学生,试图在 Java 中为 WebSSO 实现一个服务提供商插件。我使用 Shibboleth IdP 作为身份提供者。我已经能够将身份验证请求发送到 IdP,并通过 servlet 成功
我有SSO login setup with Azure与上面的类似: 在我的应用程序 (RP) 端的 ACS 发出的 POST 请求 (6&7) 中,我得到: ~~~~~~~~~ 发布 wa:wsi
我正在使用Onelogin 2.0 toolkit 。我没有将登录和 ACS 作为 jsp 文件添加,而是将它们添加为休息服务。当我的 IdP 重定向到 ACS 服务 URL 时,我收到此错误。 SA
我正在尝试将我的 SAML 2.0 服务集成到 Azure B2C 中。我们已成功实现单点登录,但无法使单点退出完全正常工作。 我们已将问题范围缩小到我们的服务未正确处理注销响应,特别是 B2C 调用
阅读SAML core documentation我不知道在 SP 启动的 SAML2.0 后重定向流中哪里需要 InResponseTo(如果有的话)。 文档规定 InResponseTo 在 Su
我正在尝试将我的 SAML 2.0 服务集成到 Azure B2C 中。我们已成功实现单点登录,但无法使单点退出完全正常工作。 我们已将问题范围缩小到我们的服务未正确处理注销响应,特别是 B2C 调用
阅读SAML core documentation我不知道在 SP 启动的 SAML2.0 后重定向流中哪里需要 InResponseTo(如果有的话)。 文档规定 InResponseTo 在 Su
请告诉我使用 Azure AD SAML2.0 在 ASP.net MVC 中实现 SAML 2.0 的代码。我们已经在 SSO 中使用了以下 SAML 协议(protocol)方法,但它并未与 Az
请告诉我使用 Azure AD SAML2.0 在 ASP.net MVC 中实现 SAML 2.0 的代码。我们已经在 SSO 中使用了以下 SAML 协议(protocol)方法,但它并未与 Az
我是一名优秀的程序员,十分优秀!