2

如何验证 ASP.NET MVC 应用程序的用户(使用用户名和密码)?我正在尝试从我的 WPF 客户端使用WebClient、传递NetworkCredentials、发布请求到 ASP.NET MVC 应用程序来执行此操作。如何在服务器上处理此请求?如何获取传递的用户名和密码?

我在 ASP.NET MVC 应用程序中使用表单身份验证(使用新项目创建的默认设置)。

4

2 回答 2

5

表单身份验证分两步进行:

  1. 用户进入登录页面并输入他的用户名和密码并将它们发送到服务器
  2. 服务器验证它们,如果它们是正确的,它会发出一个发送给客户端的身份验证 cookie。客户端存储此 cookie 并将其与每个后续请求一起发送到服务器。

因此,要在 WPF 应用程序中实现这一点,您首先需要获取身份验证 cookie。因此,首先向登录页面发送一个 POST 请求以及用户名和密码,并读取返回的 cookie(为此,您需要在 HttpWebRequest 上设置 CookieContainer 属性,以便它能够捕获 cookie)。获得 cookie 后,您可以在后续调用经过身份验证的页面时重用 cookie 容器。

您可以查看此示例代码来帮助您(只需替换地址和参数名称)。

于 2010-09-23T06:28:20.357 回答
1

这段代码对我有用,使用了 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
        }
    }
于 2013-08-15T20:05:02.237 回答