OAuth2 401 Несанкционированный с сервера ресурсов

Я попытался реализовать аутентификацию и авторизацию OAuth2. У меня есть сервер авторизации и сервер ресурсов. Клиент входит на сервер авторизации (отправляет имя пользователя и пароль на сервер авторизации), а сервер авторизации возвращает access_token. Клиент использует access_token, чтобы запросить любой ресурс с тегом [Authorize] от resource_server.

Часть аутентификации (отправка учетных данных на сервер авторизации и возврат access_token) работает нормально. Я получил действительный токен JWT. Проблема в том, что сервер ресурсов не распознает access_token. Каждый раз, когда клиент отправляет запрос на получение ресурса, имеющего тег [Authorize], я получаю: "401 Неправильная авторизация отклонена для этого запроса".

Это список вещей, которые я пробовал / проверял:

  1. Я проверил, чтобы Microsoft.Owin.Security.OAuth была одинаковой версией на сервере ресурсов и авторизации (версия 2.1.0).
  2. Я проверил, чтобы client_id и secret были одинаковой версией на сервере ресурсов и авторизации
  3. Я убедился, что на ресурсе и на сервере авторизации есть один и тот же ключ компьютера (одинаковые значения в файлах web.config и iis)
  4. Я проверил, чтобы в iis была включена анонимная аутентификация (и любая другая форма аутентификации отключена)
  5. У меня CORS включен везде
  6. Оба сервера находятся на одной машине.
  7. Я проверил запрос к серверу ресурсов, и токен отправляется в заголовке авторизации следующим образом: Authorization:JWT eyJ0eXAiO.......JuRpuf6yWg
  8. Я отправил такой же запрос почтальону, но получил тот же ответ

Моя реализация основана на этих двух уроках:

  1. http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/
  2. http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/

Это класс Startup.cs на моем сервере ресурсов:

using Microsoft.Owin.Cors;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.DataHandler.Encoder;
using Microsoft.Owin.Security.Jwt;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System.Threading.Tasks;
using System.Web.Http;
using Web.Api.App_Start;

namespace Web.Api
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();
            ConfigureOAuth(app);
            app.UseAutofacMiddleware((newAutofacContainer())
                  .ConfigureContainer(config));
            app.UseCors(CorsOptions.AllowAll);
            WebApiConfig.Register(config);
            app.UseWebApi(config);
        }

        public void ConfigureOAuth(IAppBuilder app)
        {
            var issuer = "http://localhost:81/Auth.Server";
            var audience = "AUDIENCE";
            var secret = TextEncodings.Base64Url.Decode("SECRET");
            app.UseJwtBearerAuthentication(
                new JwtBearerAuthenticationOptions
                {
                    AuthenticationMode = AuthenticationMode.Active,
                    AllowedAudiences = new[] { audience },
                    IssuerSecurityTokenProviders = new 
                          IIssuerSecurityTokenProvider[]
                          {
                             new SymmetricKeyIssuerSecurityTokenProvider(issuer, 
                                secret)
                           },
                    Provider = new OAuthBearerAuthenticationProvider
                    {
                        OnValidateIdentity = context =>
                        {
                            context.Ticket.Identity.AddClaim(new 
                               System.Security
                               .Claims.Claim("newCustomClaim", "newValue"));
                            return Task.FromResult<object>(null);
                        }
                    }
                });

        }
    }
}

1 ответ

Решение

[Решено]: должно быть Authorization:Bearer eyJ0eXAiO.......JuRpuf6yWg (Носитель НЕ JWT!)

Другие вопросы по тегам