【问题标题】:ASP.NET Web API Questions - Authorization / AuthenticationASP.NET Web API 问题 - 授权/身份验证
【发布时间】:2012-05-27 22:09:37
【问题描述】:

有人要求我为客户创建一个 API。在开始之前,我有一些问题。我决定使用 ASP.NET Web API 技术。我创建了我的第一个方法,它工作正常,我能够以 XML/Json 格式返回一组产品结果。问题是,任何访问我网站上的 API 的人都可以看到我所有的产品。我已经有一个客户数据库,我该如何使用它,以便在访问我的 API 之前,他们必须设置一些凭据。

Web 和桌面客户端都应该可以访问 API

我想到的一种方法是,他们将用户名/密码作为参数传递,但这似乎不太安全/对吗?例如:api/products/GetById/750?username=bob&pass=123

【问题讨论】:

    标签: asp.net-mvc-3 wcf model-view-controller asp.net-web-api


    【解决方案1】:

    使用用户名/密码组合很好,但不是通过查询字符串传递,而是以更标准化的方式(HTTP 基本身份验证)进行,即将此信息添加到消息的请求标头中。下面是代码的样子:

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://localhost:8010/api/Customer/1");
    //Add a header to the request that contains our credentials
    //DO NOT HARDCODE IN PRODUCTION!! Pull credentials real-time from database or other store.
    string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user1"+ ":" + "test"));
    req.Headers.Add("Authorization", "Basic " + svcCredentials);
    

    您的问题被标记为“WCF”和“Web API”,因此检查凭据服务器端有点不同。但是,您实际上是拉出“授权”标头并检查凭据以查看用户是否经过身份验证和授权。如果它们未通过身份验证,则返回 HTTP 401 消息。

    对于托管在 IIS 中的基于 WCF REST 的服务,您可以从我的博客文章中查看完整的详细示例:

    Using Basic Authentication In REST Based Services Hosted in IIS

    【讨论】:

      【解决方案2】:

      绝对不是通过查询字符串。

      为什么不使用 ASP.NET Membership? MSDN

      或者,您可以编写自己的身份验证并检查用户是否具有适当的权限,然后再传回产品列表。

      http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

      【讨论】:

      • 是的,但是在访问我的 api 之前,他们如何将凭据传递给会员提供者/自定义身份验证器?
      • @DarrenDavies 不,你不能使用 REST,他正在使用 Web API。
      • @BiffBaffBoff - 看看这个:sixgun.co.uk/blog/2012/02/29/…
      • 好的,这解释了如何授权,但是客户端在调用我的 api 之前会在哪里输入他们的凭据?
      【解决方案3】:

      你可以使用 AuthorizeAttribute 来装饰你的控制器/动作。

      [Authorize]
      public IEnumerable<Product> Get() {...}
      

      这可以将您的资源限制为仅对经过身份验证的用户可用。

      实际的身份验证方法是另一回事。默认情况下,Web API 使用基于 cookie 的 ASP.NET 表单身份验证,如果 api 直接从 html+js Web 客户端使用,这很好。

      另一方面,如果您的 API 将由桌面/移动应用程序或基于插件的 Web 客户端使用,则使用 HTTP Basic 身份验证可能会更好,因为您不必管理 cookie(请记住在这种情况下使用 SSL) .

      您可能想查看我在http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/ 的博客文章,其中展示了如何提供使用 ASP.NET 成员资格和角色提供程序的 http 基本身份验证。

      【讨论】:

      • 这很好,但是客户如何输入他们的凭据来获得授权?我必须公开一个方法吗?
      • 这取决于您使用的客户端平台。例如,使用 .NET WebClient 您可能会设置 WebClient.Credentials 属性。
      【解决方案4】:
      • 您希望将 API 托管在 SSL 文件夹中。这将加密所有通信(与通过网络发送您的信用卡 # 相同)

      • 您还可以对 URL 进行加密,使其如下所示:

        api/products/GetById/750?u=828s388332e328e38&amp;p=328e23e2i38324r423ur29834

        但这代表了一个挑战,因为现在您必须同步客户端使用的加密方法

      • 您还可以使用令牌,并让您的客户检索具有到期日期的令牌。令牌过期(1 小时或 1 天等)。然后 URL 可以如下所示:

        api/products/GetById/750?token=1241824123yxxcn2r348

      • 您还可以使用私钥/公钥: MSDN

      【讨论】:

      • SSL 用于加密通信,但与问题所在的授权或身份验证没有任何关系。
      • 虽然问题的标题是关于授权和身份验证,但他担心从客户端传递凭据。 SSL 将有助于将风险降至最低。
      猜你喜欢
      • 2012-09-10
      • 1970-01-01
      • 2018-07-12
      • 2012-10-02
      • 2017-01-23
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 2014-07-01
      相关资源
      最近更新 更多