c# application login to joomla

2019-05-27 05:32发布

问题:

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?

回答1:

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".



回答2:

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 :)!



回答3:

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();


标签: c# login joomla