2016-01-22 146 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

如果有帮助,请接受答案。谢谢! –