如何使用安全的 Rest MVC 网站 api

How to consume a secure Rest MVC web api

我只是 .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

我已经完成了一种请求我的网站 api 的方法,在另一个 project/solution 中,当我从我的网站 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 的每个请求中使用令牌?

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

谢谢。

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

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

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

MVC WebAPI authentication from Windows Forms

我已经创建了一个从我的 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 请求一些东西,我需要做的只是在所有请求的 header 上添加令牌,如下面的行所示:

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

希望它可以帮助像我一样开始使用 .NET web API 的其他人。

此致。