OAuth2 401未经授权从资源服务器

时间:2017-06-09 00:27:36

标签: asp.net oauth-2.0 owin http-status-code-401 unauthorized

我尝试实施OAuth2身份验证和授权。我有一个授权服务器和一个资源服务器。客户端登录授权服务器(将用户名和密码发送给授权服务器),授权服务器返回access_token。客户端使用access_token来请求resource_server中带有[Authorize]标记的任何资源。

身份验证部分(将凭据发送到授权服务器并返回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标头中发送,如下所示:Authorization:JWT eyJ0eXAiO.......JuRpuf6yWg
  8. 我和邮递员发了同样的请求,但收到的回复相同
  9. 我的实现基于这两个教程:

    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/
    3. 这是我的资源服务器中的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 个答案:

答案 0 :(得分:0)

[求助]:它应该是Authorization:Bearer eyJ0eXAiO.......JuRpuf6yWg持票人 NOT JWT!)