C# ASP MVC+;获取身份验证cookie的HttpWebRequest应用程序,如何强制其工作?
本文结尾处的最终更新 我整天都在工作,但我不能让它工作:C# ASP MVC+;获取身份验证cookie的HttpWebRequest应用程序,如何强制其工作?,c#,asp.net-mvc,httpwebrequest,C#,Asp.net Mvc,Httpwebrequest,本文结尾处的最终更新 我整天都在工作,但我不能让它工作: private void button1_Click(object sender, EventArgs e) { var loginUri = new Uri(@"http://localhost:5898/Account/Login"); const string strLoginData = "Login=ojejq&Password=ojejqjejq&returnUrl=%2F"; var
private void button1_Click(object sender, EventArgs e)
{
var loginUri = new Uri(@"http://localhost:5898/Account/Login");
const string strLoginData = "Login=ojejq&Password=ojejqjejq&returnUrl=%2F";
var cookie = GetAuthCookie(loginUri, strLoginData);
}
public CookieContainer GetAuthCookie(Uri loginUri, string data)
{
var cookieJar = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.Method = "POST";
request.CookieContainer = cookieJar;
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";
var myWriter = new StreamWriter(request.GetRequestStream());
myWriter.Write(data);
myWriter.Close();
request.GetResponse();
return cookieJar;
}
在我的ASP MVC
应用程序中,我有一个/Account/Login
POST
控制器,它甚至没有被上述代码击中。我做错了什么
编辑:我的asp mvc应用程序中的两个登录操作:
[AllowAnonymous]
public ActionResult Login()
{...}
及
第二次更新:添加了登录模型
public class LoginModel
{
[Required]
[Display(Name = "Login", ResourceType = typeof(NameResources))]
[StringLength(16, ErrorMessageResourceName = "LoginLengthError", ErrorMessageResourceType = typeof(NameResources), MinimumLength = 4)]
public string Login { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password", ResourceType = typeof(NameResources))]
[StringLength(32, ErrorMessageResourceName = "PasswordLengthError", ErrorMessageResourceType = typeof(NameResources), MinimumLength = 8)]
public string Password { get; set; }
}
第三个更新:我忘了提到,在我的web.config中设置了cookieless=“AutoDetect”选项。我不知道它有没有变化
最终更新:首先,感谢大家抽出时间,所有试图帮助我的人都获得了投票权。我发现问题不在代码中,而是在我的VisualStudio开发服务器中。它以某种方式重定向了我的按钮1POST请求,在过程中丢失了数据,并将该请求更改为GET请求。我知道,werid,但代码还可以。谢谢您的时间。我认为您应该在以下位置尝试“用户名”而不是“登录”:
也试试这个:
public CookieCollection GetAuthCookie(Uri loginUri, string data)
{
var cookieJar = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.Method = "POST";
request.CookieContainer = cookieJar;
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";
var myWriter = new StreamWriter(request.GetRequestStream());
myWriter.Write(data);
myWriter.Close();
var webResponse = request.GetResponse() as HttpWebResponse;
return webResponse.Cookies;
}
我认为您应该在以下位置尝试“用户名”而不是“登录”:
也试试这个:
public CookieCollection GetAuthCookie(Uri loginUri, string data)
{
var cookieJar = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.Method = "POST";
request.CookieContainer = cookieJar;
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";
var myWriter = new StreamWriter(request.GetRequestStream());
myWriter.Write(data);
myWriter.Close();
var webResponse = request.GetResponse() as HttpWebResponse;
return webResponse.Cookies;
}
您可以添加控制器操作的签名吗?(帐户/登录)
[AllowAnonymous]public ActionResult Login()
和[HttpPost][AllowAnonymous]public ActionResult Login(LoginModel模型,字符串返回URL)
button1的代码是一个标准的c应用程序,用于从我的另一个asp mvc获取auth cookieapp@Erwin,我的按钮1代码只点击GET login操作,它应该只点击POST一个…cookieJar
是请求的CookieContainer
,而不是响应。您需要捕获从GetReponse
返回的响应,并检查其中的cookie。您可以添加控制器操作的签名吗?(帐户/登录)[AllowAnonymous]public ActionResult Login()
和[HttpPost][AllowAnonymous]public ActionResult Login(LoginModel模型,字符串返回URL)
button1的代码是一个标准的c应用程序,用于从我的另一个asp mvc获取auth cookieapp@Erwin,我的按钮1代码只点击GET login操作,它应该只点击POST一个…cookieJar
是请求的CookieContainer
,而不是响应。您需要捕获从GetReponse
返回的响应,并检查那里的cookie。好吧,这应该会命中他的控制器方法(假设他的LogInModel有一个名为UserName的属性),但这不会使完整的代码工作。实际上,它对我有效,它返回了一个带有“\uu RequestVerificationToken”的cookie,对吗,我对第一个答案做了评论(没有GetAuthCookie()代码段)。我想现在应该行了,你拿到我的+1@YasserSinjab,您所做的唯一更改是var webResponse=request.GetResponse()作为HttpWebResponse代码>对吗?因为它仍然没有影响到我的[帖子]动作-/好的,我会告诉你我做了什么。我保留“AccountController”作为默认值,但我在HttpPost“Login”方法中注释了“[ValidateAntiForgeryToken]”属性。然后我创建WPF应用程序,然后复制代码,粘贴它,就这样:)好吧,这应该会命中他的控制器方法(假设他的LogInModel有一个名为UserName的属性)但它不能使完整的代码正常工作。实际上,它对我有效,它返回了一个带有“\uu RequestVerificationToken”的cookie。对,我对第一个答案做了评论(没有GetAuthCookie()代码段)。我想现在应该行了,你拿到我的+1@YasserSinjab,您所做的唯一更改是var webResponse=request.GetResponse()作为HttpWebResponse代码>对吗?因为它仍然没有影响到我的[帖子]动作-/好的,我会告诉你我做了什么。我保留“AccountController”作为默认值,但我在HttpPost“Login”方法中注释了“[ValidateAntiForgeryToken]”属性。然后我创建WPF应用程序,然后复制代码,粘贴它,就这样:)
public CookieCollection GetAuthCookie(Uri loginUri, string data)
{
var cookieJar = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.Method = "POST";
request.CookieContainer = cookieJar;
request.ContentLength = data.Length;
request.ContentType = "application/x-www-form-urlencoded";
var myWriter = new StreamWriter(request.GetRequestStream());
myWriter.Write(data);
myWriter.Close();
var webResponse = request.GetResponse() as HttpWebResponse;
return webResponse.Cookies;
}