WCF OAuth-不使用RESTFUL服务

本文关键字:RESTFUL 服务 OAuth- WCF | 更新日期: 2023-09-27 18:00:51

我已经对WCF服务进行了一些背景研究,我们决定研究为我们的服务提供身份验证的方法。我建议使用OAuth,但是我们不确定OAuth是否可以用于NOTRESTful的WCF服务。这些也将遍布SSL。

我们可以在服务调用中将OAuth变量作为对象与其他参数一起传递吗?

[OperationContract]
public void GetTheAwesome(OAuthObject oauth, AwesomeObject awesome);
[OperationContract]
public OAuthRequestObject Authorise(string username, string pass);
[OperationContract]
public OAuthObject Authenticate(OAuthRequestObject authObj);
[DataContract]
public class OAuthRequestObject
{
    [DataMember]
    public string ConsumerKey { get; set; }
    [DataMember]
    public string ConsumerSecret { get; set; }
}
[DataContract]
public class OAuthObject
{
    [DataMember]
    public string AccessKey { get; set; }  // our key
    [DataMember]
    public string AccessSecret { get; set; }  // our signature/secret
    [DataMember]
    public string Timestamp { get; set; }  // our timestamp
    [DataMember]
    public string SignatureMethod { get; set; }  // our signature method (HMAC/SHA, etc)
}

这是一种有效的方式吗?OAuth能以这种方式工作吗?OAuth是否仅限于RESTful调用?

我只是把事情搞得过于复杂了吗?如果我向我们的开发人员指定了一个明确的用户名/密码,以包含在我们的其他应用程序中,他们会正常工作吗?

WCF OAuth-不使用RESTFUL服务

OAuth规范(第7.1节(提供了一个可扩展点,以允许新的访问令牌类型,每个令牌类型都指定必须与该令牌一起使用的身份验证方法。例如;"载体";令牌类型指定该令牌应作为"授权"形式的授权头附加;Bearer";。

这里有一个链接到规范:

https://www.rfc-editor.org/rfc/rfc6749

这里有一个片段:

访问令牌类型为客户端提供成功利用访问令牌进行受保护资源请求所需的信息(以及特定类型的属性(。如果客户端不了解令牌类型,则不得使用访问令牌。

例如;"载体";[RFC6750]中定义的令牌类型通过简单地在请求中包括访问令牌字符串来使用:

 GET /resource/1 HTTP/1.1
 Host: example.com
 Authorization: Bearer mF_9.B5f-4.1JqM

而";mac";[OAuth HTTP MAC]中定义的令牌类型是通过发布消息验证码(MAC(密钥和用于对HTTP请求的某些组件进行签名的访问令牌来使用的:

 GET /resource/1 HTTP/1.1
 Host: example.com
 Authorization: MAC id="h480djs93hd8",
                    nonce="274312:dj83hs9s",
                    mac="kDZvddkndxvhGRXZhvuDjEWhGeE="

以上示例仅用于说明目的。建议开发人员在使用之前参考[RFC6750]和[OAuth HTTP MAC]规范。

每个访问令牌类型定义指定发送到客户端的附加属性(如果有的话(;access_token";响应参数。它还定义了HTTP身份验证方法,用于在发出受保护的资源请求时包含访问令牌。

如果您要为您的服务实现授权服务器,那么您可以自由定义您想要的任何令牌类型以及身份验证方案。不过要注意互操作性。如上所述,您的服务只能与支持SOAP的客户端一起工作,第三方可能会发现您有点难以处理。

如果您使用的是现有的第三方授权服务器,那么他们将定义令牌类型,您应该遵守他们的身份验证方案。

WS-Trust选项

当您在.Net/WCF/SOAP世界中时,一个更好的选择可能是使用WS-Trust/WS-Federation。这在带有Windows Identity Foundation(WIF(的WCF中得到了很好的支持。根据您使用的.Net版本,WIF可以内置在核心框架(.Net 4.5(中,也可以单独安装(.Net 3.5和4(。

它的基本思想是,对安全令牌的请求以及在进行服务调用时将其插入SOAP请求的方式是标准化的。这将用标准操作替换AuthoriseAuthenticate操作,并用标准SOAP安全标头替换显式OAuthObject参数。

在引擎盖下,它是复杂的,但在我看来,WIF实现完美地抽象了所有的复杂性。

概述可以在这里找到:

http://msdn.microsoft.com/en-us/library/hh291066(v=vs.110(.aspx