2016-01-22 191 views
0

我只是.NET世界的初學者,我創建了一個web api(.NET 4.5.2),我使用上面的註釋[Authorize]如控制器如下圖所示:如何使用安全的Rest Rest MVC web api

[Authorize] 
public class PhasesController : ApiController 
{ 
    private TestReportEntities db = new TestReportEntities(); 

    // GET: api/Phases 
    public IQueryable<Phase> GetPhase() 
    { 
     return db.Phase; 
    } 
} 

我已經創建了我的數據庫,我使用的是web.api用於管理訪問的默認表,你可以在這個圖像上看到:

My tables

我已經做了一個方法來請求我的web api,在另一個項目/解決方案,它的工作當我從我的web api控制器中刪除註釋[Authorize]時很好。

這是關於我如何請求我的API的例子:

public int GetCurrentIdPhase(int idProject) 
    { 
     int phaseId = -1; 

     WebRequest request = WebRequest.Create(string.Concat(URL, string.Format("api/phases/?idProject={0}", idProject))); 

     using (var resp = (HttpWebResponse)request.GetResponse()) 
     { 
      using (var reader = new StreamReader(resp.GetResponseStream())) 
      { 
       string objText = reader.ReadToEnd(); 
       var phase = JsonConvert.DeserializeObject<List<Phase>>(objText); 
       phaseId = phase[0].id; 
      } 
     } 

     if (phaseId != -1) 
     { 
      return phaseId; 
     } 
     else 
     { 
      throw new Exception("Phase not found"); 
     } 
    } 

在這一天結束我的問題是:

  1. 我如何申請令牌到我的API( POST - www.myApi /令牌)使用上面的例子?
  2. 如何在我的API的每個請求中使用該令牌?

如果你能幫助我,我會非常感激。

謝謝。

+0

http://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api 從該頁面的ToC中還有很多文章 – BlackICE

+0

This答案也可以幫助:http:// stackoverflow。com/a/12525250/264607 – BlackICE

回答

0

我創建了一個方法,從我的Web API獲得令牌,這是方法:

var request = (HttpWebRequest)WebRequest.Create(string.Concat(URL, "token")); 

       var postData = "grant_type=password"; 
       postData += string.Format("&userName={0}", user); 
       postData += string.Format("&password={0}", pass); 
       var data = Encoding.ASCII.GetBytes(postData); 

       request.Method = "POST"; 
       request.ContentType = "application/x-www-form-urlencoded"; 
       request.ContentLength = data.Length; 

       using (var stream = request.GetRequestStream()) 
       { 
        stream.Write(data, 0, data.Length); 
       } 

       var response = (HttpWebResponse)request.GetResponse(); 

       string objText = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
       var requestedToken = (JObject)JsonConvert.DeserializeObject(objText); 
       token = string.Concat(token, requestedToken["access_token"].Value<string>()); 

,並要求些什麼東西給API的所有我需要做的就是加上所有請求的報頭中的令牌一樣顯示在下面的橫線:

request.Headers.Add(HttpRequestHeader.Authorization, getToke()); 

希望它可以幫助別人誰也開始使用.NET的Web API像我這樣的工作。

問候。

0

我假設「GetCurrentIdPhase」調用來自一個不相關的應用程序與未經驗證的身份驗證 - 如果任何身份驗證。

的困難,這裏是使用授權和traidtional瀏覽器的認證流程。下面是一個更改流水線的例子,以便使用不同的身份驗證表單來使用控制檯/桌面應用程序。你不會說你在哪裏調用GetCurrentIdPhase,所以我將不得不假設一個單獨的應用程序。如果它是一個Web應用程序,並且您使用相同的表進行身份驗證,那麼您將必須在它們之間共享令牌,例如,上面提供的網址blackice。

如果應用程序是桌面/控制檯/ etc(而不是另一個用戶必須對相同表進行認證的應用程序),那麼您可以嘗試使用這種方法來更改認證的方式,以便於訪問。

MVC WebAPI authentication from Windows Forms

+0

感謝您的回答亞當,你是對的,我的方法「GetCurrentIdPhase」是在另一個不相關的應用程序。我已經看到這個鏈接,你建議我,但我不明白它如何幫助我。 –

+0

如果有幫助,請接受答案。謝謝! –