OAuth2 401 未经资源服务器授权

OAuth2 401 Unauthorized from resource server

我尝试实现OAuth2 身份验证和授权。我有一个授权服务器和一个资源服务器。客户端登录授权服务器(将用户名和密码发送给授权服务器),授权服务器returns和access_token。客户端使用 access_token 来从 resource_server.

请求任何带有 [Authorize] 标签的资源

身份验证部分(将凭据发送到授权服务器并取回 access_token)工作正常。我得到一个有效的 JWT 令牌。 问题是资源服务器无法识别access_token。每次客户端发送请求以获取具有 [Authorize] 标记的资源时,我都会得到:'401 Unauthorized Authorization has been denied for this request'.

这是我 tried/verified:

的清单
  1. 我检查过 Microsoft.Owin.Security.OAuth 与资源服务器和授权服务器(版本 2.1.0)上的版本完全相同
  2. 我检查了 client_id 和 secret 在资源和授权服务器上的版本是否完全相同
  3. 我确保资源服务器和授权服务器上的机器密钥完全相同(web.config 文件和 iis 中的值相同)
  4. 我检查了 iis 是否启用了匿名身份验证(并禁用了任何其他形式的身份验证)
  5. 我到处都启用了 CORS
  6. 两个服务器在同一台机器上。
  7. 我验证了对资源服务器的请求,令牌在授权 header 中发送,如下所示: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.csclass:

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

        }
    }
}

[已解决]:应该是 Authorization:Bearer eyJ0eXAiO.......JuRpuf6yWgBearer 不是 JWT!)