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:
的清单
- 我检查过 Microsoft.Owin.Security.OAuth 与资源服务器和授权服务器(版本 2.1.0)上的版本完全相同
- 我检查了 client_id 和 secret 在资源和授权服务器上的版本是否完全相同
- 我确保资源服务器和授权服务器上的机器密钥完全相同(web.config 文件和 iis 中的值相同)
- 我检查了 iis 是否启用了匿名身份验证(并禁用了任何其他形式的身份验证)
- 我到处都启用了 CORS
- 两个服务器在同一台机器上。
- 我验证了对资源服务器的请求,令牌在授权 header 中发送,如下所示:
Authorization:JWT eyJ0eXAiO.......JuRpuf6yWg
- 我向邮递员发送了相同的请求,但得到了相同的响应
我的实现基于这两个教程:
- http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/
- 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.......JuRpuf6yWg
(Bearer 不是 JWT!)
我尝试实现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:
的清单- 我检查过 Microsoft.Owin.Security.OAuth 与资源服务器和授权服务器(版本 2.1.0)上的版本完全相同
- 我检查了 client_id 和 secret 在资源和授权服务器上的版本是否完全相同
- 我确保资源服务器和授权服务器上的机器密钥完全相同(web.config 文件和 iis 中的值相同)
- 我检查了 iis 是否启用了匿名身份验证(并禁用了任何其他形式的身份验证)
- 我到处都启用了 CORS
- 两个服务器在同一台机器上。
- 我验证了对资源服务器的请求,令牌在授权 header 中发送,如下所示:
Authorization:JWT eyJ0eXAiO.......JuRpuf6yWg
- 我向邮递员发送了相同的请求,但得到了相同的响应
我的实现基于这两个教程:
- http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/
- 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.......JuRpuf6yWg
(Bearer 不是 JWT!)