Подтвердить что ты не робот

Я получаю "Авторизация была отклонена для этого запроса". сообщение об ошибке при использовании OWIN oAuth middleware (с отдельным сервером Auth и Resource Server)

Я пытаюсь отделить мой сервер авторизации и ресурсов. Я следую примеру, приведенному в этом уроке:

http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/

Это код в моем Startup.cs на моем сервере auth:

using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AuthServer.Web
{
   public class Startup
   {
      public void Configuration(IAppBuilder app) {
         ConfigureOAuth(app);
      }

      public void ConfigureOAuth(IAppBuilder app)
      {
         OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
         {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = new SimpleAuthorizationServerProvider()
         };

         // Token Generation
         app.UseOAuthAuthorizationServer(OAuthServerOptions);
         app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

      }
   }
}

Это startup.cs на моем сервере ресурсов (т.е. пример приложения Web api):

using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AuthTestApi.Web
{
   public class Startup
   {
      public void Configuration(IAppBuilder app)
      {
         app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
         app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
      }      
   }
}

Когда я отправляю следующий запрос в конечную точку "\ token" моего сервера auth, я успешно получаю токен:

{
access_token: "PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8",
token_type: "bearer",
expires_in: 86399
}

Когда я отправляю следующий запрос на контроллер, я получаю сообщение об ошибке "Авторизация было отклонено для этого запроса"?

GET /api/Test HTTP/1.1
Host: localhost:63305
Accept: application/json
Content-Type: application/json
Authorization: Bearer PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8
Cache-Control: no-cache
Postman-Token: aeca8515-70b1-ef2c-f317-bf66136dccab

Мои серверные серверные и ресурсные/веб-проекты api находятся в разных решениях и работают на разных портах (... не уверены, если это имеет значение, но, думаю, Id упоминает об этом).

В этот момент эти 2 проекта используют промежуточное ПО OAuth OWIN (и имеют очень маленький пользовательский код). Средство промежуточного программного обеспечения является черным ящиком, и вам просто нужна помощь в выяснении, почему я получаю это сообщение об ошибке.

Также обратите внимание, что я запускаю оба сервера в двух проектах веб-приложений Visual Studio 2013, которые находятся в разных решениях VS 2013, работающих на разных портах. Я не уверен, что это важно, но я подумал, что я упоминал об этом.

Спасибо заранее.

4b9b3361

Ответ 1

Я столкнулся с одной и той же проблемой за последние пару дней, хотя я размещаю оба приложения на одном компьютере (разные порты), но он не работал без добавления машинного ключа и файлов web.config и убедитесь, что, что тот же номер версии пакета, установленный в обоих приложениях

Ответ 2

Я столкнулся с той же проблемой и нашел решение:

Вам нужно зарегистрировать генератор токена OAuth и токены пользователя OAuth до регистрации WebAPI.

Какой смысл имеет смысл, если вы думаете об этом как о конвейере, в котором должна присутствовать аутентификация/авторизация перед обработкой запросов контроллерами.

TL; DR: Изменить

appBuilder.UseWebApi(config);

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

Для

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

appBuilder.UseWebApi(config);

Ответ 3

Я также получал сообщение об ошибке "Авторизация была отклонена для этого запроса", хотя у меня нет отдельных серверов авторизации и ресурсов.

Я использую Ninject OwinHost и настроил его в Startup перед настройкой OAuth следующим образом:

public void Configuration(IAppBuilder app)
{
    var config = new HttpConfiguration();

    app.UseNinjectMiddleware(() =>
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }).UseNinjectWebApi(config);

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(CorsOptions.AllowAll);
    app.UseWebApi(config);
}

Я обнаружил, что перемещение конфигурации Ninject до конца разрешило проблему, например:

public void Configuration(IAppBuilder app)
{
    var config = new HttpConfiguration();

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(CorsOptions.AllowAll);
    app.UseWebApi(config);

    app.UseNinjectMiddleware(() =>
    {
        var kernel = new StandardKernel();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }).UseNinjectWebApi(config);
}

Возможно, ваша проблема связана с порядком запуска вашего промежуточного программного обеспечения.

Ответ 4

В моем сообщении я понял, что вам нужно переопределить machineKey node для обоих API (Authorization Server и Resource Server) и совместно использовать один и тот же файл machineKey между файлами web.config. Как вы принимаете эти два разных проекта? они находятся на одной машине или разных машинах? Вернитесь к шагу 5 из сообщения и проверьте, как вы можете это сделать.

Ответ 5

Для меня проблема заключалась в несоответствующем номере версии в пакетах Owin:

 <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>

После обновления необходимых старых пакетов все работало как шарм.:)

Ответ 6

В вашем классе OwinStartup IAppBuilder.UseOAuthBearerTokens() нужно называть BEFORE IAppBuilder.UseWebApi()

public void Configuration(IAppBuilder app)
{
    app.UseOAuthBearerTokens(...);
    app.UseWebApi(...);
}

Ответ 7

Я получил ту же ошибку. Когда я впервые изучал Web Api, я создал проект с шаблоном Web Api, но я не нажал кнопку "Изменить аутентификацию". Я должен был выбрать "Нет аутентификации".

Кроме того, удаление атрибутов [Authorize] работало и для меня.

[Authorize] <--Remove these attributes
public class ValuesController : ApiController