2016-08-12 2 views
0

ボイラープレートコードフォームを使用してプロジェクトテンプレートを作成しました。ログインした.net core mvc6 webappを作成しました。.Net MVC 6デスクトップアプリケーションからの承認

ログインコントローラは、次のとおりです。

// POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) 

LoginViewModelは次のとおりです。私は、ログインウェブページからログインすることができます

public class LoginViewModel 
{ 
    [Required] 
    [EmailAddress] 
    public string Email { get; set; } 

    [Required] 
    [DataType(DataType.Password)] 
    public string Password { get; set; } 

    [Display(Name = "Remember me?")] 
    public bool RememberMe { get; set; } 
} 

デスクトップの.net c#プログラムからこのプロジェクトの[Authorization]属性を持つコントローラ(APIとして)を使用したいと考えています。このため私は、ログインコントローラからクッキーを取得し、そのクッキーを使ってAPIにアクセスしようとしています。

 private void btnLogin_Click(object sender, EventArgs e) 
    { 
     HttpWebRequest http = WebRequest.Create(loginUrl) as HttpWebRequest; 
     http.KeepAlive = true; 
     http.Method = "POST"; 
     http.ContentType = "application/x-www-form-urlencoded"; 

     var login = new LoginViewModel(); 
     login.Email = txtUserName.Text; 
     login.Password = txtPassword.Text; 
     var postData = new JavaScriptSerializer().Serialize(login); 

     byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData); 
     http.ContentLength = dataBytes.Length; 

     using (Stream postStream = http.GetRequestStream()) 
     { 
      postStream.Write(dataBytes, 0, dataBytes.Length); 
     } 
     HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

// ITがWITH HTTP 400

 // Probably want to inspect the http.Headers here first 
     http = WebRequest.Create(authorized) as HttpWebRequest; 
     http.CookieContainer = new CookieContainer(); 
     http.CookieContainer.Add(httpResponse.Cookies); 
     HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse; 
    } 

LoginViewModel HERE停止します

クッキーを取得するためのデスクトップソフトウェアのコードは、(追加JSONシリアライズとコピーペースト状のStackOverflow)でありますクラスにはwebappと同じプロパティがあります。

  1. は私のロジックはOKです:

    残念ながら、それは動作しません、HTTPレスポンスは400

    質問ありますか?はいの場合、コードが間違っている場所を指摘できますか?

  2. クッキーベースの認証はOKですか?快適なWeb​​ APIにアクセスできますか?

  3. HTTPSであれば、トラフィック量の少ないWebサービスに使用できますか?

  4. strompathやauth0のようなサードパーティのプロバイダがなくてもそれを行うには良い方法がありますか?

答えて

2

私のロジックはOKですか?はいの場合、コードが間違っている場所を指摘できますか?それでもステータスコードとして400を取得している場合は任意のヒントの応答を確認し、(

http.ContentType = "application/json"; 

:あなたのAPIは、JSONなどのデータを想定している場合

、あなたはおそらく適切ContentTypeヘッダーを設定する必要がありますあなたが間違って送信しているものに関するAPIから)。

クッキーベースの認証はOKですか?快適なWeb​​ APIにアクセスできますか?

おそらくブラウザ以外のクライアントからの可能性がありますが、おそらくそれを行う最良の方法ではありません。 セキュリティ保護されたAPIにアクセスするための一般的な選択は、ベアラトークンによるものです。トークンは、IDプロバイダのエンドポイント(アプリケーションまたはAuth0やStormPathなどのサードパーティプロバイダ)から取得し、そのトークンをAPIへのリクエストごとにAuthorizationヘッダーに含めます。これに関するいくつかの議論については、https://auth0.com/blog/cookies-vs-tokens-definitive-guide/を参照してください。

あなたのAPIは、アクセスを許可する別の方法としてベアラトークンを受け入れるように準備する必要があります。 .Net Coreの場合、一部のミドルウェアはHTTPヘッダーで受信トークンを検査し、検証し、Authorize属性が期待通りに機能するようにClaimsPrincipalを設定します。

通常、トークンは検査とデバッグが可能です(署名されていて暗号化されていない)ので、クッキーを使用した方が優れています。たとえば、トークンを調べて期限切れであるかどうかを確認し、新しいトークンを取得して、APIからのエラーを回避できます。

HTTPSであれば、トラフィック量の少ないWebサービスに使用できますか?

これは、トークンのサポートを追加するAPIを制御できない場合にのみ実行できます。

strompathやauth0のようなサードパーティーのプロバイダがなければ、より良い方法がありますか?

JWTフォーマットはオープンで標準です。自分自身を生成し、構築しなければならない認証API(セッションクッキーの代わりにトークンを返す)からそれらを返す可能性があります。

あなたはJWTsを持っていたら、MicrosoftはJWTトークンを使用してAPIを保護するのに役立ちますパッケージを提供しています:

Install-Package Microsoft.AspNetCore.Authentication.Jwt 

認証、しかし、誤解しやすいです。これは、StormpathやAuth0のようなサードパーティプロバイダが本当に便利になる場所です。免責事項:私はAuth0のために働いています。

関連する問題