我正在尝试通过 silverlight 应用程序实现主动联合。 我想从我的 silverlight 应用程序中向 ADFS 请求 SAML 令牌。 我无法在 silverlight 应用程序中使用 WSTrustChannel,因为它不允许添加 System.IdentityModel 或 Microsoft.IdentityModel。 请帮忙。
//This code will get you the SAML Token for SAP Odata Services in C# for Desktop or Web
protected HttpClient Client
{
get
{
if (client == null)
{
handler = new HttpClientHandler();
handler.Credentials = new NetworkCredential(username, password);
handler.AllowAutoRedirect = false;
handler.CookieContainer = cookies;
handler.UseCookies = true;
client = new HttpClient(handler);
client.MaxResponseContentBufferSize = 9999999;
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
client.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
client.DefaultRequestHeaders.ExpectContinue = false;
}
return client;
}
}
public String GetSAML()
{
if (client != null)
{
client = null;
}
String text = "";
String SAMLTokenBase64String="";
String urlRelayParty = "Your_Relay_party_identifier";
string url = String.Format("{0}?loginToRp={1}", "https://***yourdomainforstsoradfs*****.com/adfs/ls/IdpInitiatedSignOn.aspx", HttpUtility.UrlEncode(urlRelayParty));
do
{
result = Client.GetAsync(url).GetAwaiter().GetResult();
text = result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
IEnumerable<string> values;
if (result.Headers.TryGetValues("location", out values))
{
foreach (string s in values)
{
if (s.StartsWith("/"))
{
url = url.Substring(0, url.IndexOf("/adfs/ls")) + s;
}
else
url = s;
}
}
else
{
url = "";
}
}
while (!String.IsNullOrEmpty(url));
Regex reg = new Regex("SAMLResponse\\W+value\\=\\\"([^\\\"]+)\\\"");
MatchCollection matches = reg.Matches(text);
foreach (Match m in matches)
{
SAMLTokenBase64String = m.Groups[1].Value;
}
if (SAMLTokenBase64String != null && SAMLTokenBase64String.Trim().Length > 0)
{
SB("STS Login Successfull for " + urlRelayParty);
return SAMLTokenBase64String;
}
SB("STS Login Failed for " + urlRelayParty);
return "";
}