为什么我的DotNetOpenAuth使用者不尊重版本1.0a?

为什么我的DotNetOpenAuth使用者不尊重版本1.0a?

问题描述:

我正在构建一个使用DotNetOpenAuth的OAuth服务提供程序,并对其进行测试我已经修改了示例wcf使用者以简单地调用一个普通的http端点。令牌请求工作正常,但是当我请求访问受保护的资源,我得到了以下协议execption:为什么我的DotNetOpenAuth使用者不尊重版本1.0a?

The following required parameters were missing from the DotNetOpenAuth.OAuth.Messages.AuthorizedTokenRequest message: oauth_verifier 

当我看到日志输出我的服务提供商我看到这一点:

Error while performing basic validation of AuthorizedTokenRequest with these message parts: 
oauth_token: pgzjBIs0pKCeDIcaIinyrV5Jhi0= 
oauth_consumer_key: sampleconsumer 
oauth_nonce: TM0Rc8kg 
oauth_signature_method: HMAC-SHA1 
oauth_signature: zmpxK5c69n1VzTEEcrnnd4e+qYI= 
oauth_version: 1.0 
oauth_timestamp: 1305067751 

请注意oauth_version:1.0,即使我在创建使用者时指定了ProtocolVersion.V10a。

如果我双方指定ProtocolVersion.V10我得到这个异常:

Expected message DotNetOpenAuth.OAuth.Messages.AccessProtectedResourceRequest but received DotNetOpenAuth.OAuth.Messages.AuthorizedTokenRequest instead. 

这里是消费代码来获取令牌(这是直接从示例代码):

WebConsumer consumer = this.CreateConsumer(); 
UriBuilder callback = new UriBuilder(Request.Url); 
callback.Query = null; 
string[] scopes = (from item in this.scopeList.Items.OfType<ListItem>() 
        where item.Selected 
        select item.Value).ToArray(); 
string scope = string.Join("|", scopes); 
var requestParams = new Dictionary<string, string> { { "scope", scope } }; 
var response = consumer.PrepareRequestUserAuthorization(callback.Uri, requestParams, null); 
consumer.Channel.Send(response); 

这里是我的失败消费代码:

var accessToken = Session["WcfAccessToken"] as string; 
var consumer = CreateConsumer(); 
var serviceEndpoint = new MessageReceivingEndpoint("https://mymachine/test/getUserName", HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.PostRequest); 
var httpRequest = consumer.PrepareAuthorizedRequest(serviceEndpoint, accessToken); 
var httpResponse = httpRequest.GetResponse(); 

在我的服务提供商我叫SERV iceProvider.ReadProtectedResourceAuthorization();除了上面提到的例外,它失败了。

任何想法我做错了什么?

+0

你能拓展你的问题,包括对实际摆在首位获得令牌消费者的源代码? – 2011-05-11 13:20:02

+0

我在我的问题中提到,我添加了获取授权的调用,该部分使用的是DotNetOpenAuth附带的示例中的OAuthConsumer SampleWcf.aspx页面。 – 2011-05-11 16:02:18

这是我的一个愚蠢的错误,我从IServiceProviderTokenManager返回错误的TokenType。正确的逻辑显示服务提供商样品中,看起来是这样的:

if (tokenObject.State == TokenAuthorizationState.AccessToken) 
    return TokenType.AccessToken; 
return TokenType.RequestToken;