【问题标题】:How to consume a secure Rest MVC web api如何使用安全的 Rest MVC web api
【发布时间】:2016-01-22 23:36:56
【问题描述】:

我只是 .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 的每个请求中使用令牌?

如果你能帮助我,我将不胜感激。

谢谢。

【问题讨论】:

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


【解决方案1】:

我创建了一个从我的 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 的其他人。

问候。

【讨论】:

    【解决方案2】:

    我假设“GetCurrentIdPhase”调用来自具有未真实身份验证的无关应用程序 - 如果有任何身份验证。

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

    如果应用程序是桌面/控制台/等(不是用户必须针对相同表进行身份验证的另一个应用程序),那么您可以尝试这种方法来更改身份验证的完成方式以使其更易于访问。

    MVC WebAPI authentication from Windows Forms

    【讨论】:

    • 感谢您的回答亚当,您是对的,我的方法“GetCurrentIdPhase”在另一个不相关的应用程序中。我已经看过你建议我的这个链接,但我不明白它对我有什么帮助。
    猜你喜欢
    • 2013-10-22
    • 2014-05-03
    • 2014-09-22
    • 2021-11-27
    • 2013-03-07
    • 2015-06-14
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    相关资源
    最近更新 更多