Cross-domain authentication ASP.net MVC

后端 未结 6 614
刺人心
刺人心 2021-02-04 12:00

I have two different web application built with ASP.net MVC. This two application may not be running in the same server nor in the same domain.

I would like that if a us

6条回答
  •  孤城傲影
    2021-02-04 12:41

    Thanks to the answer of @Kaushik Thanki I have implemented some code that fix my problem. I will post here the solution that it works for me, even if it is not the optimus.

    First of all, I have implemented in A a method to make a Post request to B. Inside this method I take the id of the user and I make a hash of it with some other parameter and passwords. Then, I send to B the user id, the hash, and a boolean to choose between login and logout.

    private void SendPostRequest(bool login)
            {
                // Create the combine string
                string data = // userId combined with more stuff
    
                // Create the hash of the combine string
                HashAlgorithm algorithm = MD5.Create();
                byte[] hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(data));
                StringBuilder sb = new StringBuilder();
                foreach (byte b in hash)
                    sb.Append(b.ToString("X2"));
    
                string encriptedData = sb.ToString();
    
                // Fill the url with the path and the data
                string url = "http://localhost/xxx/yyy/ExternalAuthentication/Login?id=" + _cachedCustomer.Id + "&hash=" + encriptedData + "&login=" + login.ToString();
    
                // Make the Post request
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream resStream = response.GetResponseStream();
            }
    

    After it, I have created in B a new class to handle the login logic. I have use a HttpContext.Current.Application variable to store the status of the authentication:

    public class ExternalAuthenticationController : Controller
            {
    
                public ActionResult Index()
                {
                    return View();
                }
    
                public ActionResult Login(string id, string hash, string login)
                {
                   // Create the combine string
                   string data = //user id + same stuff than in A;
    
                   // Create the hash of the combine string
                   HashAlgorithm algorithm = MD5.Create();
                   byte[] hashArray =    algorithm.ComputeHash(Encoding.UTF8.GetBytes(data));
                   StringBuilder sb = new StringBuilder();
                   foreach (byte b in hashArray)
                      sb.Append(b.ToString("X2"));
                   string originalHash = sb.ToString();
    
                   // Compare the two hash. If they are the same, create the variable
                   if (hash.CompareTo(originalHash) == 0)
                   {
    
                   if (System.Web.HttpContext.Current.Application["Auth"] == null)
                   {
                       System.Web.HttpContext.Current.Application["Auth"] = false;
                   }
    
                   if (Convert.ToBoolean(login))
                   {
                       System.Web.HttpContext.Current.Application["Auth"] = true;
                   }
    
                  else
                  {
                      System.Web.HttpContext.Current.Application["Auth"] = false;
                  }
                 }
             }
    

    Probably, the answer provided by @vijay shiyani is better and more generalistic, but from my point of view it requires a lot of time to implement it.

提交回复
热议问题