API应该对Web和桌面客户端都可用。
我想到的一种方法是,他们将用户名/密码作为参数传递,但这似乎并不安全/正确?例如:
api/products/GetById/750?username=bob&pass=123
api/products/GetById/750?username=bob&pass=123
[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 基本身份验证。
绝对不要通过查询字符串传递。
为什么不使用ASP.NET Membership? MSDN
或者,您可以编写自己的身份验证,并在返回产品列表之前检查用户是否具有适当的权限。
http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/
你想将API托管在SSL文件夹中。这将加密所有通信(与通过Web发送您的信用卡号码相同)。
您还可以加密URL,使其读取如下:
api/products/GetById/750?u=828s388332e328e38&p=328e23e2i38324r423ur29834
但这会带来挑战,因为现在您必须同步客户端使用的加密方法。
您还可以使用令牌,并让客户端检索具有过期日期的令牌。令牌过期(1小时、1天等)。然后URL可以看起来像这样:
api/products/GetById/750?token=1241824123yxxcn2r348
您还可以使用私钥/公钥: MSDN
使用用户名/密码组合是可以的,但与其通过查询字符串传递,不如采用更标准化的方式(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服务,您可以从我的博客文章中查看完整的详细示例: