C#Siteminder身份验证
我正在尝试编写一些代码来连接到使用Siteminder身份验证的HTTPS站点 我一直在申请401。有什么想法吗 我在这里读了一些不同的东西,但没有一件看起来真的那么有用。我还使用Fiddler/Firefox Tamper来窥探正在发生的事情 以下是到目前为止我对代码的了解:C#Siteminder身份验证,c#,siteminder,C#,Siteminder,我正在尝试编写一些代码来连接到使用Siteminder身份验证的HTTPS站点 我一直在申请401。有什么想法吗 我在这里读了一些不同的东西,但没有一件看起来真的那么有用。我还使用Fiddler/Firefox Tamper来窥探正在发生的事情 以下是到目前为止我对代码的了解: try { Uri uri = new Uri("https://websiteaddresshere"); HttpWebRequest request
try
{
Uri uri = new Uri("https://websiteaddresshere");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri) as HttpWebRequest;
request.Accept = "text/html, application/xhtml+xml, */*";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko";
// request.Connection = "Keep-Alive";
// request.Method = "Get";
// request.Accept = "text";
request.AllowAutoRedirect = true;
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
Cookie emersoncookie = new Cookie("SMCHALLENGE", "YES");
emersoncookie.Domain = "mydomain";
emersoncookie.Path = "/";
// authentication
var cache = new CredentialCache();
cache.Add(uri, "False", new NetworkCredential("myusername", "mypassword"));
request.Credentials = cache;
// response.
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
XmlTextReader reader = new XmlTextReader(stream);
MessageBox.Show(stream.ToString());
}
}
}
catch (WebException exception)
{
string responseText;
using (var reader = new StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
MessageBox.Show(responseText.ToString());
}
}
在MSDN网站上做了更多的阅读之后,我决定走另一条路 我最终将此作为一项服务,因为它需要在一天结束时成为一项服务,并执行了以下操作:
CookieContainer emersoncookie = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create("https://websiteaddress");
request.Credentials = new NetworkCredential("username", "password");
request.CookieContainer = emersoncookie;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)
request.GetResponse();
Stream resStream = response.GetResponseStream();
using (Stream output = File.OpenWrite(@"c:\\somefolder\\somefile.someextention"))
using (Stream input = resStream)
{
input.CopyTo(output);
}
对于任何可能遇到Siteminder身份验证问题的人来说,这段代码工作得非常好。我无法让Jasen的代码正常工作。也许你的SM设置与我的不同。但使用SiteMinder,通常需要两步认证过程。下面的代码块适用于我:
//Make initial request
RestClient client = new RestClient("http://theResourceDomain/myApp");
client.CookieContainer = new CookieContainer();
IRestResponse response = client.Get(new RestRequest("someProduct/orders"));
//Now add credentials.
client.Authenticator = new HttpBasicAuthenticator("username", "password");
//Get resource from the SiteMinder URI which will redirect to the correct API URI upon authentication.
response = client.Get(new RestRequest(response.ResponseUri));
尽管这使用了RestSharp,但可以使用HttpClient甚至HttpWebRequest轻松复制它