Почему мой потребитель DotNetOpenAuth не уважает версию 1.0a? - PullRequest
1 голос
/ 11 мая 2011

Я создаю поставщика услуг OAuth с использованием DotNetOpenAuth, и для его тестирования я изменил пример потребителя wcf, чтобы он просто вызывал простую конечную точку http. Запрос токена работает нормально, но когда я запрашиваю доступ к защищенному ресурсу, я получаю следующее исполнение протокола:

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();

У моего поставщика услуг я вызываю serviceProvider.ReadProtectedResourceAuthorization (); и это терпит неудачу за исключением того, что я упомянул выше.

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 12 мая 2011

Это была глупая ошибка с моей стороны, я возвращал неправильный TokenType из моего IServiceProviderTokenManager. Правильная логика показана в примере поставщика услуг и выглядит примерно так:

if (tokenObject.State == TokenAuthorizationState.AccessToken)
    return TokenType.AccessToken;
return TokenType.RequestToken;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...