DotNetOpenAuth ctp 4.0 ResourceServer.VerifyAccess () метод выбрасывает нулевое исключение - PullRequest
0 голосов
/ 07 января 2012

У меня проблемы с попыткой заставить работать DotNetOpenAuth ctp 4.0.Вот ситуация: у меня есть ресурсный сервер, такой же, как в образце OAuth2, однако я использую предварительный просмотр WCF Web Api 6, поэтому я написал точку расширения, отвечающую за проверку того, что клиент, выполняющий запрос к операции, ужеавторизованный для этого, для этого вызывается метод ResourceServer.VerifyAccess.Этот метод выдает нулевое исключение, и я не выяснил, почему.

Вот как я написал свой обработчик операций:

protected override HttpRequestMessage OnHandle(HttpRequestMessage input)
    {
        var principal = VerifyOAuth2(input);
        if(principal == null)
        {
            throw new HttpResponseException(new HttpResponseMessage
                                                {
                                                    StatusCode = HttpStatusCode.Unauthorized,
                                                    Content = new StringContent("Invalid Access Token")
                                                });
        }

        var roles = _authorizationAttribute.Roles.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries);
        if(!roles.Any(role => principal.IsInRole(role)))
        {
            throw new HttpResponseException(new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.Forbidden,
                Content = new StringContent("User has not permission to access this resource")
            });
        }

        return input;
    }

    private static IPrincipal VerifyOAuth2(HttpRequestMessage request)
    {
        var headers = request.Headers;
        var headersCollection = new WebHeaderCollection();
        foreach (var header in headers)
        {
            headersCollection.Add(header.Key, header.Value.ToString());
        }

        using (var signing = MvcApplication.CreateAuthorizationServerSigningServiceProvider())
        {
            using (var encrypting = MvcApplication.CreateResourceServerEncryptionServiceProvider())
            {
                var resourceServer = new ResourceServer(new StandardAccessTokenAnalyzer(signing, encrypting));

                IPrincipal result;
                var httpRequestInfo = new HttpRequestInfo(request.Method.ToString(), request.RequestUri,
                                                          request.RequestUri.AbsoluteUri, headersCollection, request.Content.ReadAsStreamAsync().Result);//Since I dont have an HttpResourceInfo Object I need to build one from my request, using an overloaded method. 
                var error = resourceServer.VerifyAccess(httpRequestInfo, out result); //here is where the exception is thrown. 
                // TODO: return the prepared error code.
                return error != null ? null : result;
            }
        }

Я не знаю, помогает ли этот код, но если это не так, можете ли вы сказать мне, когда этот метод генерирует исключение нулевой ссылки?Может быть, это поможет мне немного!заранее спасибо.

1 Ответ

1 голос
/ 08 января 2012

Будет полезна трассировка стека для NullReferenceException.

Вместо этого вы пытались получить HttpRequestMessageProperty из WCF и передать его конструктору HttpRequestInfo так, как OAuthAuthorizationManagerделает в образце?

...