WPFアプリケーションからASP.NET MVCユーザーを認証します
-
04-10-2019 - |
質問
ASP.NET MVCアプリケーションのユーザー(ユーザー名とパスワードを使用して)を認証するにはどうすればよいですか?私はこれを使ってやろうとしています WebClient
, 、通過 NetworkCredentials
, 、WPFクライアントからASP.NET MVCアプリケーションにリクエストを投稿します。サーバーでこのリクエストを処理するにはどうすればよいですか?合格したユーザー名とパスワードを取得するにはどうすればよいですか?
ASP.NET MVCアプリ(新しいプロジェクトで作成されたデフォルト)でフォーム認証を使用しています。
解決
フォーム認証は2つのステップで機能します:
- ユーザーはログインページに移動し、ユーザー名とパスワードを入力してサーバーに送信します
- サーバーはそれらを検証し、それらが正しい場合は、クライアントに送信される認証Cookieを放出します。クライアントはこのCookieを保存し、その後の各リクエストに沿ってサーバーに送信します。
したがって、WPFアプリケーションでこれを達成するには、最初に認証Cookieを取得する必要があります。したがって、最初にユーザー名とパスワードとともにログインページにPOSTリクエストを送信し、返されたCookieを読み取ります(これについては、CookieをキャッチできるようにHTTPWebRequestにCookIeContainerプロパティを設定する必要があります)。 Cookieを手に入れたら、認証されたページへの後続の呼び出しでCookieコンテナを再利用します。
チェックアウトできます このサンプルコード あなたを支援するために(アドレスとパラメーター名を置き換えるだけです)。
他のヒント
このコードは、DarinのアプローチとリンクからWebClientExクラスを使用して、私のために機能しました。私のWPFフォームは、MVCアプリに認証し、返された認証Cookieの名前とValueを静的プロパティ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
}
}