如何验证 ASP.NET MVC 应用程序的用户(使用用户名和密码)?我正在尝试从我的 WPF 客户端使用WebClient
、传递NetworkCredentials
、发布请求到 ASP.NET MVC 应用程序来执行此操作。如何在服务器上处理此请求?如何获取传递的用户名和密码?
我在 ASP.NET MVC 应用程序中使用表单身份验证(使用新项目创建的默认设置)。
如何验证 ASP.NET MVC 应用程序的用户(使用用户名和密码)?我正在尝试从我的 WPF 客户端使用WebClient
、传递NetworkCredentials
、发布请求到 ASP.NET MVC 应用程序来执行此操作。如何在服务器上处理此请求?如何获取传递的用户名和密码?
我在 ASP.NET MVC 应用程序中使用表单身份验证(使用新项目创建的默认设置)。
表单身份验证分两步进行:
因此,要在 WPF 应用程序中实现这一点,您首先需要获取身份验证 cookie。因此,首先向登录页面发送一个 POST 请求以及用户名和密码,并读取返回的 cookie(为此,您需要在 HttpWebRequest 上设置 CookieContainer 属性,以便它能够捕获 cookie)。获得 cookie 后,您可以在后续调用经过身份验证的页面时重用 cookie 容器。
您可以查看此示例代码来帮助您(只需替换地址和参数名称)。
这段代码对我有用,使用了 Darin 的方法和他们链接中的 WebClientEx 类。我的 WPF 表单必须对 MVC 应用程序进行身份验证,并将返回的身份验证 cookie 的名称和值存储在静态属性 CookieName 和 CookieValue 中。CreateUser() 函数然后能够访问 MVC 应用程序中的安全操作。
//************************************************
//************************************************
private void Authenticate(object sender, RoutedEventArgs e)
{
using (var client = new WebClientEx())
{
var values = new NameValueCollection
{
{ "UserName", "xxx" },
{ "Password", "yyy" },
};
var byteResponse = client.UploadValues("http://localhost/MyMvcApp/Account/Login", values);
var responseString = Encoding.ASCII.GetString(byteResponse); //debugging
CookieCollection authCookie = client.CookieContainer.GetCookies(new Uri("http://localhost/"));
if (authCookie.Count > 0)
{
CookieName = authCookie[0].Name;
CookieValue = authCookie[0].Value;
}
}
}
//************************************************
//************************************************
private void CreateUser(object sender, RoutedEventArgs e)
{
using (var client = new WebClientEx())
{
var user = new NameValueCollection
{
{"FirstName" , "Xavier"},
{"LastName" , "McLann"},
{"EmailAddress" , "xavier@aol.com"},
{"Phone" , "234445585"}
};
if (!String.IsNullOrEmpty(CookieName) && !String.IsNullOrEmpty(CookieValue))
client.CookieContainer.Add(new Cookie(CookieName, CookieValue,"/","localhost"));
var byteResponse = client.UploadValues("http://localhost/MyMvcApp/Home/Create", user);
var responseString = Encoding.ASCII.GetString(byteResponse); //debugging
}
}