I need to connect to the admin panel of the site (Joomla 2.5). My question is very similar to this topic, but I have not found the solution, so am looking for your help.
Here is my sample code:
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)
But it does not work. A token value in the "source" not equal value "token". What am I doing wrong?
WebClient isn't the best way when you try to mimic a website behavior. Use HttpWebRequest and HttpWebResponse instead. And set the Connection property of the request to "Keep-alive".
Jérémie Bertrand thanks for the tip. I found this thread
With WebResponse did not understand, and use the class
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;
}
}
I wrote the code as follows
CookieAwareWebClient Client = new CookieAwareWebClient();
//...on the same
It works :)!
For everyone, a complete solution for the current joomla 2.5 release:
You need, as mentioned above, this extension for the 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;
}
}
}
Furthermore, you need this for joomla login:
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})";
/// <summary>
/// Gets the user name which is used to do the joomla login
/// </summary>
public String UserName { get; private set; }
/// <summary>
/// Gets the root uri to the joomla site.
/// </summary>
public Uri SiteRootUri { get; set; }
/// <summary>
/// Gets the last error occured when logging in
/// </summary>
public String LastError { get; private set; }
private String _password { get; set; }
private CookieAwareWebClient client;
/// <summary>
/// Initializes an instance for handling login or logoff
/// </summary>
/// <param name="userName">The username which is used to do the joomla login</param>
/// <param name="password">The username which is used to do the joomla login</param>
/// <param name="siteRoot">The root uri to the joomla site</param>
public JoomlaUserManagement(String userName, String password, Uri siteRoot)
{
UserName = userName;
_password = password;
SiteRootUri = siteRoot;
client = new CookieAwareWebClient();
}
/// <summary>
/// Performs a joomla login.
/// </summary>
/// <returns>Returns true if succeeded. False if failed. If false, error will be written to <see cref="LastError"/></returns>
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;
}
}
}
Then, you are able to login or logout:
JoomlaUserManagement userMan = new JoomlaUserManagement("john.doe", "password", new Uri("http://www.customer.ltd"));
Boolean loginResult = userMan.Login();
Boolean logoutResult = userMan.Logout();