Я получаю "Авторизация была отклонена для этого запроса". сообщение об ошибке при использовании 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, работающих на разных портах. Я не уверен, что это важно, но я подумал, что я упоминал об этом.
Спасибо заранее.
Ответы
Ответ 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