C# - HttpWebResponse redirect to external URL

自古美人都是妖i 提交于 2019-12-11 06:24:20

问题


I'm trying to achieve the following:

  • I'm building an MVC website that will help me to automatically logon to another site.
  • WebsiteA will call WebsiteB using HttpWebRequest.
  • WebsiteA will send the details of the user through headers (request.headers.add)
  • WebsiteB will handle all the user authentication and internally it will redirect to another page granting access to that user.

I've managed to achieve part of it but I'm stuck in displaying the redirection return. Anyone knows if this can be achieved?

Here is some code that gets called in the WebsiteA app:

        [HttpPost]
        [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
        public ActionResult LogIn(myModel model)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://websiteB/LogIn.aspx");
            request.AllowAutoRedirect = true;
            request.Method = "POST";
            request.Headers.Add("MyUserToLogon", model.User); //I'm sending my user through headers
            string postData = "This is a test";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            //Get the response from the Login Page
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Console.WriteLine(responseFromServer);

            reader.Close();
            dataStream.Close();
            response.Close();

            //What to do here? I want to go to the redirected page from WebSiteB/Page1.aspx
            //See code below for WebSiteB.

            return null;
        }

In WebSiteB I have the code that does the redirection when the user is successfully logged in:

        .......
        users = Request.QueryString["MyUserToLogon"];
        .......

        private void LogIn(string user)
        {
            GrantUser(user, Session.SessionID);

            HttpCookie mycookie = new HttpCookie("test");
            mycookie .Expires = DateTime.Now.AddMinutes(10);
            Response.Cookies.Add(mycookie);
            Response.AddHeader("mycookie ", mycookie .Value);

            Response.Redirect("WebsiteB/Page1.aspx");
        }

Any help would be really appreciated.


回答1:


I had the same problem for my sites.

You can't use redirect because it is done by IIS and you will never receive all your authentication cookies back from WebSiteB.

In my case returning view instead of redirect worked. And then you redirect on WebSiteA after setting cookies

Also seems you need to add cookie container for your request to get cookies back.

Here is may code

Landing site

 [HttpPost]
    public ActionResult Login(string accountId)
    {

        var url = "http://...."

        var request = (HttpWebRequest)WebRequest.Create(url + "/Account/WamLogin/");

        request.Headers.Add("user", accountId);
        request.CookieContainer = new CookieContainer();

        var response = (HttpWebResponse)request.GetResponse();

        foreach (Cookie cook in response.Cookies)
        {
            Response.Cookies.Add(new HttpCookie(cook.Name, cook.Value) { Expires = cook.Expires, HttpOnly = cook.HttpOnly, Domain = cook.Domain });
        }

        return new RedirectResult(url);
    }

Here is WebSiteB code

[AllowAnonymous]
public virtual ActionResult WamLogin(string returnUrl, string id)
{
    var accountId= Request.Headers["user"];

    .....

    return View(MVC.Account.Views.Login);
}

Hope this will help you



来源:https://stackoverflow.com/questions/27503986/c-sharp-httpwebresponse-redirect-to-external-url

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!