【问题标题】:RESTful WCF Data Service AuthenticationRESTful WCF 数据服务身份验证
【发布时间】:2011-03-03 17:06:54
【问题描述】:

我想为现有的 ASP.NET MVC 网站实现一个 REST api。我已经设法设置 WCF 数据服务,以便我可以浏览我的数据,但现在的问题是如何处理身份验证。

现在,数据服务通过网站的内置表单身份验证得到保护,从 AJAX 表单访问服务时可以这样做。但是,它并不适合 RESTful api。

作为表单身份验证的替代方案,我希望用户只需将用户名和密码嵌入到 Web 服务的 url 中或作为请求参数。

例如,如果我的网络服务通常可以访问

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 中的某处,我确实知道如何实现身份验证。另外,我不是在寻找实现表单或基本身份验证的方法。我知道该怎么做,但这不是我想要的。

【问题讨论】:

    标签: asp.net-mvc wcf authentication routing wcf-data-services


    【解决方案1】:

    OData - WCF Data Services Best Practices from TechEd - Meta-Me - Site Home - MSDN Blogs

    <system.web.extensions>
      <scripting>
        <webServices>
           <authenticationService enabled="true" />
        </webServices>
      </scripting>
    </system.web.extensions>
    

    这个怎么样?

    【讨论】:

    • takepara - 这肯定是必需的,但我感觉 adrian 正在寻找 mvc 身份验证实现的解决方案,而不是配置设置。
    • 感谢您的回复,但这不是我想要的。如果我是唯一一个针对 API 进行编码的人,那将是完美的。但是,由于我希望第三方开发人员为我的应用程序编写他们自己的客户端,因此我需要实现一个尽可能简单的 API(来自任何平台,而不仅仅是 odata 客户端所涵盖的平台)。
    【解决方案2】:

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

    你的第一个问题:

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

      如果您的服务通过 https 运行,我看不到使用此方法的任何问题。

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

    您可以在其他方法中使用 GET 参数,例如。这里流是在 body 中传递的。

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

    【讨论】:

    • 您可能指的是 WCF 吗?这篇文章是关于 WCF 数据服务的,这是完全不同的。
    • 我对您示例中的流很好奇。我可以看到文件名和用户令牌的字符串设置在哪里(通过 UriTemplate 参数)。但我看不出你是如何将流放入方法中的。
    【解决方案3】:

    我不必通过身份验证使用 restful,但我必须确保用户组有权访问 rest 服务。我通过传递给 Web 服务的 MD5 令牌来执行此操作(这是一个普通的 JSON 服务,而不是 WCF 包装器)。基本上,我“知道”哪些网站可以访问我的服务,所以我给他们自己的 API 密钥(为简单起见,它是域名的 MD5。这会通过过滤器对 urlreferrer 的传入进行检查,如果 MD5 的它匹配,然后就可以了。

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

    我很想看看其他人是如何做到这一点的,不过,对于其他项目,我可能需要一种不那么粗略的身份验证方法。

    【讨论】:

    • 吉姆,感谢您的回复。我不确定我是否正确理解了您的答案,但您使用的是令牌还是登录名/密码组合并不重要。对我来说,问题是如何将这些信息嵌入到 Web 服务的 URL 中,以便我可以执行 POST、PUT 和 DELETE 请求。如果您对此有任何想法,请告诉我!
    • 阿德里安,我在 POST 请求中嵌入了一个 json 对象,因此它永远不会“触及”网址。
    • 啊,我明白了。您使用的是 odata 还是您自己的实现?如果是 odata,我想知道您是如何解决在客户端嵌入凭据的。
    • adrian,我实际上是通过 jquery 使用该服务。用户站点被赋予了他们的 API 密钥,这被插入到 json 参数中(在 ajax 调用中),如下所示:var params = {apiKey: "942B24BC140A4920B200A5F79C4E5D9D"}。因此,当进行 ajax 调用时,会在控制器中对其进行验证。正如我所说,它的颗粒度非常高,对于您的要求来说,它可能太高了。但它对我来说效果很好。此外,apiKey 标识用户域的事实意味着如果我想要,我可以定制每个域的结果。如果您愿意,可以提供一种域特权。
    【解决方案4】:

    最后我使用了三重方法,这两种身份验证方法中的任何一种都可以在我的数据服务上正常工作:

    • 使用 API 密钥作为密码的基本身份验证
    • 通过作为请求标头嵌入的 API 密钥进行身份验证
    • 使用 API 密钥作为 API 路径的基于 URL 的身份验证。我使用代理 ASP.NET MVC 控制器实现了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2011-02-23
      • 2015-04-21
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多