RESTful WCF数据服务身份验证

4
我希望为现有的ASP.NET MVC网站实现REST API。我已经成功设置了WCF数据服务,以便可以浏览我的数据,但现在的问题是如何处理身份验证。
目前,数据服务通过站点内置的表单身份验证进行安全保护,并且当从AJAX表单访问服务时,这是可以接受的。然而,对于RESTful API来说并不理想。
作为替代方案,我希望用户可以将用户名和密码嵌入到Web服务的URL中或作为请求参数提交。
例如,如果我的Web服务通常可访问为:
http://localhost:1234/api.svc

我希望能够通过URL访问它

http://localhost:1234/api.svc/{login}/{password}

所以,我的问题如下:

  • 这是一种明智的方法吗?

  • 如果是,我该如何实现它?

似乎将登录和密码附加为GET参数来重定向GET请求很简单。我也知道如何检查http上下文并使用这些参数来过滤结果。但我不确定/如何将相同的方法应用于POST、PUT和DELETE请求。我可以在POST、PUT和DELETE请求中使用GET参数吗?

编辑:对我来说,问题是如何将登录和密码嵌入到Web服务的URL中,以便我可以针对Web服务执行POST、PUT和DELETE请求。我确实知道如何在Web服务运行并且登录/密码包含在HTTPContext中时实现身份验证。此外,我不想寻找实现表单或基本身份验证的方法。我知道如何做,但这不是我要寻找的。

4个回答

0

takepara - 这肯定是必需的,但我有一种感觉,Adrian正在寻找MVC身份验证实现的解决方案,而不是配置设置。 - jim tollan
谢谢您的回复,但这不是我要找的。如果只有我一个人编写API,那就太完美了。然而,由于我希望第三方开发人员为我的应用程序编写自己的客户端,因此我需要实现一个尽可能简单易用的API(不仅限于odata客户端所覆盖的平台)。 - Adrian Grigore

0

看看下面的答案是否有帮助:

你的第一个问题:

  • 这是一个明智的方法吗?

    如果您的服务在https上运行,我认为使用此方法没有任何问题。

  • 如果是,我该如何实现?

您可以在其他方法中使用GET参数,例如:在这里,流传递在正文中。

[OperationContract]
        [WebInvoke(Method="POST", UriTemplate = "UploadFile/{fileName}/{userToken}")]
        string UploadFile(string fileName,string userToken,Stream fileContents);

你是不是在指WCF?这篇文章是关于WCF数据服务的,它是完全不同的东西。 - Adrian Grigore
我对你的示例中的流很好奇。我可以看到文件名和用户令牌的字符串是如何设置的(通过UriTemplate参数)。但我看不到你如何将流传递到方法中。 - Konrad Viltersten

0

我没有使用过restful通过身份验证,但我必须确保用户组具有访问rest服务的权限。我通过传递到Web服务的MD5令牌来实现这一点(这是一个普通的JSON服务,而不是WCF包装器)。基本上,我“知道”哪些网站被允许访问我的服务,所以我给他们自己的API密钥(为简单起见,它是域名的MD5)。这将由过滤器对urlreferrer进行检查,如果其MD5匹配,则可以继续。

我知道这不是身份验证答案,但如果您只需要非常粗略的“身份验证”级别,那么这是一种中等信任方法。

我很想看看其他人如何做到这一点,因为我可能需要更少的课程级别来进行身份验证。


Jim,感谢您的回复。我不确定我是否正确理解了您的答案,但是无论您使用令牌还是登录/密码组合都没有关系。对我来说,问题在于如何将此信息嵌入到Web服务的URL中,以便我可以执行POST、PUT和DELETE请求。如果您有任何想法,请告诉我! - Adrian Grigore
我正在将一个 JSON 对象嵌入到 POST 请求中,因此它从未像 URL 那样被“触碰”。 - jim tollan
啊,我明白了。你是在使用OData还是自己的实现?如果是OData,我想知道你是如何解决在客户端嵌入凭据的问题的。 - Adrian Grigore
Adrian,我实际上是通过jQuery使用该服务。用户站点被赋予他们的API密钥,并将其嵌入到JSON参数中(在ajax调用中),如下所示:var params = {apiKey: "942B24BC140A4920B200A5F79C4E5D9D"}。因此,当进行ajax调用时,这将在控制器中得到验证。正如我所说,它非常粗略,可能对您的要求来说太高了。但对我来说效果非常好。此外,apiKey标识用户域,这意味着如果我想要,我可以根据域定制结果。一种域特权的方式,如果您喜欢的话。 - jim tollan

0
最终我采用了三种方法,这些身份验证方法在我的数据服务上都可以正常工作:
  • 使用API密钥作为密码的基本身份验证
  • 通过嵌入请求头的API密钥进行身份验证
  • 使用API密钥作为API路径的基于URL的身份验证。我使用代理ASP.NET MVC控制器实现了这一点。

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