如何使用安全的Rest MVC web api

时间:2016-01-22 23:36:56

标签: asp.net asp.net-web-api authorize

我只是.NET世界的初学者,我创建了一个web api(.NET 4.5.2),我在我的控制器上面使用了注释[Authorize],如下所示:

[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 / token)请求令牌?
  2. 如果我已经获得了令牌,我可以在每次申请API时使用令牌吗?
  3. 如果你能帮助我,我会非常感激。

    感谢。

2 个答案:

答案 0 :(得分:0)

我假设“GetCurrentIdPhase”调用来自一个不相关的app with unrealted auth - 如果有任何auth。

这里的难点在于使用Authorize和traidtional浏览器身份验证流程。这是一个更改管道以使用不同的auth表单来使用控制台/桌面应用程序的示例。你没有说你从哪里调用GetCurrentIdPhase所以我将不得不假设一个单独的应用程序。如果它是一个Web应用程序并且您使用相同的表进行身份验证,那么您将必须使用ex来共享它们之间的令牌。上面提供的url blackice。

如果应用程序是桌面/控制台/等(不是用户必须针对相同表格进行身份验证的其他应用程序),那么您可以尝试使用此方法来更改身份验证的方式,以便更轻松地访问。

MVC WebAPI authentication from Windows Forms

答案 1 :(得分:0)

我已经创建了一个从Web API获取Token的方法,这是方法:

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的人。

问候。