代码之家  ›  专栏  ›  技术社区  ›  Adrian Grigore

RESTful WCF数据服务身份验证

  •  4
  • Adrian Grigore  · 技术社区  · 15 年前

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

    现在,数据服务通过站点的内置表单身份验证得到保护,当从Ajax表单访问服务时,这是正常的。但是,对于RESTfulAPI来说,它并不理想。

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

    例如,如果我的Web服务通常作为

    http://localhost:1234/api.svc
    

    我想可以使用URL访问它

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

    因此,我的问题如下:

    • 这是明智的做法吗?

    • 如果是,我如何实现这一点?

    重新定向GET请求,以便将登录名和密码附加为GET参数,这看起来很简单。我还知道如何检查HTTP上下文并使用这些参数来过滤结果。但我不确定相同的方法是否可以应用于发布、放置和删除请求。我可以在POST、PUT和DELETE请求中使用GET参数吗?

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

    4 回复  |  直到 9 年前
        1
  •  0
  •   takepara    15 年前

    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>
    

    这个怎么样?

        2
  •  0
  •   Adrian Grigore    15 年前

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

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

    我不必通过身份验证使用restful,但我必须确保用户组有权访问rest服务。我通过一个传递给Web服务的MD5令牌(这是一个普通的JSON服务,而不是一个WCF包装器)来实现这一点。基本上,我“知道”哪些网站允许访问我的服务,所以我给他们自己的API密钥(为了简单起见,它是域名的MD5)。这会被一个过滤器根据urlreferr来检查,如果它的md5匹配,那么它就是一个go。

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

    不过,对于我可能需要较少课程粒度的身份验证方法的其他项目,我希望看到其他人是如何做到这一点的。

        4
  •  0
  •   Konrad Viltersten    9 年前

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

    你的第一个问题:

    • 这是明智的做法吗?

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

    • 如果是,我如何实现这一点?

    您可以在其他方法中使用get参数,例如在body中传递流。

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