gpt4 book ai didi

.net - 序列化/反序列化 GenericXmlSecurityToken 和安全性 - CRM Auth

转载 作者:行者123 更新时间:2023-12-02 01:54:10 25 4
gpt4 key购买 nike

我正在使用 Microsoft.Xrm.Sdk.Client.IServiceManagement 中的 Authenticate 方法对 CRM 用户进行身份验证。
这个方法返回System.IdentityModel.Tokens.GenericXmlSecurityToken,我需要将其作为 WebService 响应(JSON 或 XML 格式)返回。

计划是让 WebService 客户端在后续请求中传递此 token 。
我的问题是我无法构造回 token ...

我的理解是,我需要 TokenXmlProofTokenInternalTokenReference 来构造有效的 GenericXmlSecurityToken用于身份验证。

我的问题:

  • 我可以将 ProofTokenInternalTokenReference 发送回 WebService 客户端吗,它安全吗?我可以轻松返回 TokenXML、ProofToken 和 InternalTokenReference,但我不确定它是否安全...
  • 如果上面的答案是,是否有任何其他方法可以序列化/反序列化这种 token 以便将其传递回客户端?

在此先感谢您的帮助!
问候

最佳答案

以下代码不保证面向 future ,但适用于当前使用的 Dynamics CRM 版本(2011、2013 和 2015)。从 2015 年开始,支持 OAuth,这似乎是一种更好的在线传递 token 的方式。

SecurityTokenResponse 转换为 Base64 编码的字符串:

    public static string Serialize(SecurityTokenResponse securityTokenResponse)
{
XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Encoding = Encoding.UTF8;

using (MemoryStream memoryStream = new MemoryStream())
using (XmlWriter xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings))
{
WSTrust13ResponseSerializer serializer = new WSTrust13ResponseSerializer();
WSTrustSerializationContext context = new WSTrustSerializationContext();
serializer.WriteXml(securityTokenResponse.Response, xmlWriter, context);
xmlWriter.Flush();

return Convert.ToBase64String(memoryStream.ToArray());
}
}

将 Base64 编码的字符串转换回 SecurityTokenResponse:

    public static SecurityTokenResponse ParseToken(string serializedToken)
{
RequestSecurityTokenResponse response;
using (MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(serializedToken)))
using (XmlReader xmlReader = XmlReader.Create(memoryStream))
{
WSTrust13ResponseSerializer serializer = new WSTrust13ResponseSerializer();
WSTrustSerializationContext serializationContext = new WSTrustSerializationContext();
response = serializer.ReadXml(xmlReader, serializationContext);
}

SecurityToken proofKey = new BinarySecretSecurityToken(response.RequestedProofToken.ProtectedKey.GetKeyBytes());
DateTime? created = null;
DateTime? expires = null;
if (response.Lifetime != null)
{
created = response.Lifetime.Created;
expires = response.Lifetime.Expires;
}
if (!created.HasValue)
{
throw new Exception("Created unspecified");
}
if (!expires.HasValue)
{
throw new Exception("Expires unspecified");
}

SecurityToken securityToken = new GenericXmlSecurityToken(
response.RequestedSecurityToken.SecurityTokenXml,
proofKey,
created.Value,
expires.Value,
response.RequestedAttachedReference,
response.RequestedUnattachedReference,
new ReadOnlyCollection<IAuthorizationPolicy>(new List<IAuthorizationPolicy>())
);

return new SecurityTokenResponse()
{
Response = response,
Token = securityToken
};
}

选择 Base64 作为编码的原因是因为我通过 XML 网络服务发送 token 。这消除了对 XML 字符串进行 XML 转义的需要。这可能会导致大量转义:><& 等。如果您不发送序列化 token XML 网络服务,您可能希望使用更易读的编码,例如 UTF8

关于.net - 序列化/反序列化 GenericXmlSecurityToken 和安全性 - CRM Auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21133362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com