ASP.NET Web API问题 - 授权/身份验证

5
我被要求为客户创建API。在开始之前,我有一些问题。我决定使用ASP.NET Web API技术。我已经创建了我的第一个方法,并且它运作良好,我能够以XML/Json格式返回一组产品结果集。问题是,任何访问我网站上的API的人都将能够看到所有我的产品。我已经拥有客户数据库,如何使用它以便于在访问我的API之前设置一些凭据。
API应该对Web和桌面客户端都可用。
我想到的一种方法是,他们将用户名/密码作为参数传递,但这似乎并不安全/正确?例如:api/products/GetById/750?username=bob&pass=123
4个回答

7
您可以使用AuthorizeAttribute来装饰您的控制器/操作。
[Authorize]
public IEnumerable<Product> Get() {...}

这可以限制资源仅供已验证的用户使用。

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

另一方面,如果您的 API 将由桌面 / 移动应用程序或插件基础 web 客户端使用,则使用 HTTP 基本身份验证可能更好,因为您不必管理 cookies(请记住在此场景中使用 SSL)。

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


这很棒,但客户端如何输入他们的凭据以获得授权?我需要公开一个方法吗? - CallumVass
这取决于您使用的客户端平台。例如,如果使用 .NET WebClient,则可能需要设置 WebClient.Credentials 属性。 - Piotr Walat

3

是的,但是他们如何在访问我的API之前向成员资格提供程序/自定义身份验证器传递他们的凭据呢? - CallumVass
1
@DarrenDavies 不,使用 REST 无法做到,他正在使用 Web API。 - Mathew Thompson
1
@BiffBaffBoff - 看看这个:http://sixgun.co.uk/blog/2012/02/29/asp-net-web-api-basic-authentication/ - Darren
1
好的,这解释了如何授权,但客户在调用我的API之前在哪里输入他们的凭据? - CallumVass

3
  • 你想将API托管在SSL文件夹中。这将加密所有通信(与通过Web发送您的信用卡号码相同)。

  • 您还可以加密URL,使其读取如下:

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

    但这会带来挑战,因为现在您必须同步客户端使用的加密方法。

  • 您还可以使用令牌,并让客户端检索具有过期日期的令牌。令牌过期(1小时、1天等)。然后URL可以看起来像这样:

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

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


SSL用于加密通信,但与授权或身份验证没有任何关系,而问题正是关于这方面的。 - Miika L.
1
虽然问题的标题是关于授权和认证,但他担心从客户端传递凭据。SSL将有助于最小化风险。 - Internet Engineer

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',因此在服务器端检查凭据有点不同。但是,您基本上可以提取'Authorization'头并检查凭据以查看用户是否已通过身份验证和授权。如果他们没有经过身份验证,则返回HTTP 401消息。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接