c#应用程序登录到joomla

我需要连接到网站的管理面板(Joomla 2.5)。 我的问题与此主题非常相似,但我没有找到解决方案,所以我正在寻求您的帮助。

这是我的示例代码:

WebClient Client = new WebClient(); System.Collections.Specialized.NameValueCollection Collection = new System.Collections.Specialized.NameValueCollection(); Collection.Add("username", "--my username--"); Collection.Add("passwd", "--my password--"); Collection.Add("option", "com_login"); Collection.Add("lang", ""); Collection.Add("task", "login"); //I find the token byte[] res = Client.UploadValues("http://mysite/administrator/index.php", "POST", Collection); string source = Encoding.UTF8.GetString(res, 0, res.Length); Regex regex = new Regex("([a-zA-z0-9]{32})") Match match = regex.Match(source); if (match.Success) string token = match.Value; //add token value to collection (example value 3e2aedd3de46f8a55ec15a6eb58e1c19) Collection.Add(token, "1"); //run authorization byte[] res = Client.UploadValues("http://mysite/administrator/index.php", "POST", Collection); string source = Encoding.UTF8.GetString(res, 0, res.Length); //in the row, the other token (example 06f1740ef6d6e87ae004500edddd7d7d) 

但它不起作用。 “源”中的标记值不等于“标记”值。 我究竟做错了什么?

当您尝试模仿网站行为时,WebClient不是最佳方式。 请改用HttpWebRequest和HttpWebResponse。 并将请求的Connection属性设置为“Keep-alive”。

JérémieBertrand感谢您的提示。 我发现了这个post

用WebResponse不明白,并使用该类

 public class CookieAwareWebClient : WebClient { private CookieContainer cookie = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); if (request is HttpWebRequest) { (request as HttpWebRequest).CookieContainer = cookie; } return request; } } 

我编写的代码如下

 CookieAwareWebClient Client = new CookieAwareWebClient(); //...on the same 

有用 :)!

对于每个人来说,当前joomla 2.5版本的完整解决方案:

如上所述,您需要WebClient-Class的此扩展:

 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace joomla.Util { public class CookieAwareWebClient : WebClient { private CookieContainer cookie = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); if (request is HttpWebRequest) (request as HttpWebRequest).CookieContainer = cookie; return request; } } } 

此外,您需要这个joomla登录:

 public class JoomlaUserManagement { private const string _USERCOM = "com_users"; private const string _LOGINVIEW = "login"; private const string _LOGINTASK = "user.login"; private const string _REGEXTOKEN = "([a-zA-Z0-9]{32})"; private const string _REGEXRETURN = "([a-zA-Z0-9]{27}=)"; private const string _REGEXRETURNLOGOUT = "([a-zA-Z0-9]{52})"; ///  /// Gets the user name which is used to do the joomla login ///  public String UserName { get; private set; } ///  /// Gets the root uri to the joomla site. ///  public Uri SiteRootUri { get; set; } ///  /// Gets the last error occured when logging in ///  public String LastError { get; private set; } private String _password { get; set; } private CookieAwareWebClient client; ///  /// Initializes an instance for handling login or logoff ///  /// The username which is used to do the joomla login /// The username which is used to do the joomla login /// The root uri to the joomla site public JoomlaUserManagement(String userName, String password, Uri siteRoot) { UserName = userName; _password = password; SiteRootUri = siteRoot; client = new CookieAwareWebClient(); } ///  /// Performs a joomla login. ///  /// Returns true if succeeded. False if failed. If false, error will be written to  public Boolean Login() { NameValueCollection collection = new NameValueCollection(); collection.Add("username", UserName); collection.Add("password", _password); collection.Add("option", _USERCOM); collection.Add("lang", ""); collection.Add("view", _LOGINVIEW); // Request tokens. String token = null; String returnToken = null; byte[] result = client.UploadValues(SiteRootUri, "POST", collection); string resultingSource = Encoding.UTF8.GetString(result, 0, result.Length); Regex regex = new Regex(_REGEXTOKEN); Match match = regex.Match(resultingSource); if (match.Success) token = match.Value; regex = new Regex(_REGEXRETURN); match = regex.Match(resultingSource); if (match.Success) returnToken = match.Value; // Perform login if (returnToken != null && token != null) { collection.Add(token, "1"); collection.Add("return", returnToken); collection.Add("task", "user.login"); result = client.UploadValues(SiteRootUri, "POST", collection); resultingSource = Encoding.UTF8.GetString(result, 0, result.Length); // Invalid token? if (resultingSource.Length > 16) return true; else { LastError = "Unable to login."; return false; } } else { // We don't have all tokens LastError = "Unable to retrieve tokens."; return false; } } public Boolean Logout() { NameValueCollection collection = new NameValueCollection(); collection.Add("username", UserName); collection.Add("password", _password); collection.Add("option", _USERCOM); collection.Add("lang", ""); collection.Add("view", _LOGINVIEW); // Request tokens. String token = null; String returnToken = null; byte[] result = client.UploadValues(SiteRootUri, "POST", collection); string resultingSource = Encoding.UTF8.GetString(result, 0, result.Length); Regex regex = new Regex(_REGEXTOKEN); Match match = regex.Match(resultingSource); if (match.Success) token = match.Value; regex = new Regex(_REGEXRETURNLOGOUT); match = regex.Match(resultingSource); if (match.Success) returnToken = match.Value; // Perform login if (returnToken != null && token != null) { collection.Add(token, "1"); collection.Add("return", returnToken); collection.Add("task", "user.logout"); result = client.UploadValues(SiteRootUri, "POST", collection); resultingSource = Encoding.UTF8.GetString(result, 0, result.Length); // Invalid token? if (resultingSource.Length > 16) return true; else { LastError = "Unable to logout."; return false; } } else { // We don't have all tokens LastError = "Unable to retrieve tokens."; return false; } } } 

然后,您可以登录或注销:

 JoomlaUserManagement userMan = new JoomlaUserManagement("john.doe", "password", new Uri("http://www.customer.ltd")); Boolean loginResult = userMan.Login(); Boolean logoutResult = userMan.Logout();