5

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

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

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

4

4 回答 4

7

您可以使用 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/上的博客文章,其中展示了如何提供 http 基本身份验证使用 ASP.NET 成员资格和角色提供程序。

于 2012-05-21T12:33:18.380 回答
3

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

为什么不使用 ASP.NET 成员资格?MSDN

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

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

于 2012-05-21T11:54:45.530 回答
3
  • 您希望将 API 托管在 SSL 文件夹中。这将加密所有通信(与通过网络发送您的信用卡 # 相同)

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

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

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

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

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

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

于 2012-05-21T12:07:40.413 回答
0

使用用户名/密码组合很好,但不是通过查询字符串传递,而是以更标准化的方式(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 的服务,您可以从我的博客文章中查看完整的详细示例:

在 IIS 中托管的基于 REST 的服务中使用基本身份验证

于 2013-02-19T16:29:36.763 回答