为什么我不能只是向MVC3发送休息电话?

时间:2012-10-23 18:43:08

标签: asp.net-mvc-3 authentication restsharp

我正在尝试向我的MVC3应用发送请求,我尝试过常规的WebRequest,我正在尝试使用RestSharp应用正确的Authenticator,但它仍然会返回登录页面的重定向结果?

我做错了什么?

upd:我应该如何使用RestSharp进行表单身份验证?我猜它有可能以某种方式 - 只需要玩那个饼干......

2 个答案:

答案 0 :(得分:1)

如果您被重定向到登录页面,则必须为表单身份验证设置mvc 3应用程序。表单身份验证将需要随请求一起发送的cookie。如果您在RestSharp中使用基本身份验证器,则无效。我假设您正在使用MVC控制器来提供您尝试调用的REST API。

一种选择是升级到MVC 4并使用ASP.NET Web API开发REST API。 ASP.NET Web API中的授权行为略有不同,因为它将返回HTTP 401错误,而不是执行重定向。您可以自定义AuthorizationAttribute以从HTTP标头中提取信息以进行基本身份验证和授权。

另一个选择是如果控制器上的操作不需要身份验证/授权,您可以将AllowAnonymousAttribute放在方法上。

答案 1 :(得分:0)

要通过Forms身份验证,您必须获取cookie并将其粘贴到RestSharp的cookie容器中。要获取cookie,您可以使用常规的WebRequest。

    private Cookie GetAuthCookie(string user, string pass)
    {
        var http = WebRequest.Create(_baseUrl+"Users/Login") as HttpWebRequest;
        http.AllowAutoRedirect = false;
        http.Method = "POST";
        http.ContentType = "application/x-www-form-urlencoded";
        http.CookieContainer = new CookieContainer();
        var postData = "UserName=" + user + "&Password=" + pass + "&RememberMe=true&RememberMe=false&ReturnUrl=www.google.com";
        byte[] dataBytes = System.Text.Encoding.UTF8.GetBytes(postData);
        http.ContentLength = dataBytes.Length;
        using (var postStream = http.GetRequestStream())
        {
            postStream.Write(dataBytes, 0, dataBytes.Length);
        }
        var httpResponse = http.GetResponse() as HttpWebResponse;
        return httpResponse.Cookies[FormsAuthentication.FormsCookieName];
    }