2016-08-12 107 views
0

使用樣板代碼構建項目模板我使用login創建了一個.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)。爲此,我計劃從登錄控制器獲取cookie並使用cookie訪問API。

的桌面軟件,以獲得一個cookie的代碼(複製粘貼形式StackOverflow上添加了JSON序列化):

 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; 

//它停止在這裏與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類具有與web應用程序中相同的屬性。

遺憾的是它不工作,HTTP響應是400

問題:

  1. 是我的邏輯OK?如果是的話,你能指出代碼錯在哪裏嗎?

  2. 基於cookie的身份驗證是否可以訪問Restful web api?

  3. 它可以用於低流量的web服務,因爲它將是HTTPS?

  4. 有沒有更好的方式來做到這一點,沒有任何第三方提供商如strompath或auth0?

回答

2

我的邏輯好嗎?如果是的話,你能指出代碼錯在哪裏嗎?

如果你的API預計數據爲JSON,那麼你可能會需要設置ContentType頭適當:

http.ContentType = "application/json"; 

(如果你仍然得到400的狀態代碼,檢查是否有任何暗示響應從API上發送你錯誤的內容)。

基於cookie的身份驗證可以訪問Restful web api嗎?

這是可能的,但可能不是最好的辦法,特別是從非瀏覽器客戶端。 現在流行的選擇是通過承載令牌來訪問安全的API。您從身份提供商端點(您的應用程序或第三方提供商,例如Auth0或StormPath)獲取該令牌,並且在對API的每個請求中都將該令牌包含在Authorization標頭中。有關這方面的一些討論,請參見https://auth0.com/blog/cookies-vs-tokens-definitive-guide/

您的API必須準備好接受持票人令牌作爲授權訪問的替代方式。在.Net Core的情況下,一些中間件會檢查HTTP標頭中的傳入令牌,驗證它並設置ClaimsPrincipal,以便您的屬性保持按預期工作。

通常令牌爲JWTs (Json Web Tokens),可以檢查和調試(它們是簽名的,而不是加密的),這是使用cookie的更好體驗。例如,您可以查看令牌以查看它是否過期並獲得新令牌,從而避免來自API的錯誤。

它可以用於低流量的web服務,因爲它會是HTTPS?

它可以但是,再次,這隻會做,如果你不能控制你的API來添加對令牌的支持。

有沒有更好的方式來做到這一點,沒有任何第三方提供商如strompath或auth0?

JWT格式是開放和標準的。您可能會生成您的擁有者並從您需要構建的身份驗證API返回它們(這會返回令牌而不是會話Cookie)。

一旦你的JWTs,微軟提供了一個包,這將有助於你與JWT令牌保護您的API:

Install-Package Microsoft.AspNetCore.Authentication.Jwt 

驗證,但是,是容易出錯。這就是像Stormpath或Auth0這樣的第三方供應商會非常方便的地方。免責聲明:我爲Auth0工作。