以下代碼不保證是未來的證明,但適用於當前使用的Dynamics CRM版本(2011,2013和2015)。從2015年開始,支持OAuth似乎是通過線路傳遞令牌的更好方式。
轉換一個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 Web服務中的令牌。這消除了XML轉義XML字符串的需要。這可能會導致很多轉義:>
,<
,&
等。如果您未通過XML Web服務發送序列化標記,則可能需要使用更易讀的編碼,如UTF8
。
請你能提供一個代碼示例,謝謝 – Zinov