2017-06-09 102 views
1

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

身份验证部分(向授权服务器发送凭证并取回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. 我送与邮差同样的请求,但我得到了同样的答复

我实现基于这两个教程:

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

     } 
    } 
} 
+0

[解决]:应该是授权:**持票人** eyJ0eXAiO ....... JuRpuf6yWg(持票人不是JWT!) –

回答

0

[解决]:应该是Authorization:Bearer eyJ0eXAiO.......JuRpuf6yWg承载不智威汤逊!)

相关问题