1
我试图实施OAuth2身份验证和授权。我有一个授权服务器和一个资源服务器。客户端登录授权服务器(将用户名和密码发送给授权服务器),授权服务器返回access_token。客户端使用access_token来请求resource_server中具有[Authorize]标签的资源。OAuth2 401未经授权从资源服务器
身份验证部分(向授权服务器发送凭证并取回access_token)工作正常。我得到一个有效的JWT令牌。 问题是资源服务器无法识别access_token。每次客户端发送请求以获取具有[Authorize]标签的资源时,我都会收到:'401未授权的授权已被拒绝'。
这是我尝试过的事情的清单/验证:
- 我查Microsoft.Owin.Security.OAuth既资源和授权服务器上的版本完全相同(2.1.0版本)
- 我检查了client_id和secret在资源和授权服务器上是完全相同的版本
- 我确保在资源和授权服务器上有完全相同的机器密钥(在web.config文件中有相同的值,在iis)
- 我检查了iis启用匿名身份验证(并禁用任何其他形式的身份验证)
- 我的CORS处处启用
- 这两台服务器位于同一台计算机上。
- 我验证请求到资源服务器和令牌的Authorization头发送这样的:
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.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);
}
}
});
}
}
}
[解决]:应该是授权:**持票人** eyJ0eXAiO ....... JuRpuf6yWg(持票人不是JWT!) –