我正在尝试分离我的身份验证和资源服务器。我遵循本教程中提供的示例:
http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/
这是我的认证服务器中的Startup.cs中的代码:
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace AuthServer.Web
{
public class xxxxx
{
public void Configuration(IAppBuilder app) {
ConfigureOAuth(app);
}
public void ConfigureOAuth(IAppBuilder app)
{
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
// Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}
}
}
这是我的资源服务器(即我的示例Web api应用程序)中的startup.cs:
using Microsoft.Owin.Security.OAuth;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace AuthTestApi.Web
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
}
}
}
当我将以下请求发布到身份验证服务器的“\token”endpoint时,我成功地收到了一个令牌:
{
access_token: "PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8",
token_type: "bearer",
expires_in: 86399
}
当我向我的控制器发布以下请求时,我收到“此请求的授权被拒绝”错误消息?
GET /api/Test HTTP/1.1
Host: localhost:63305
Accept: application/json
Content-Type: application/json
Authorization: Bearer PszrzJUtQUhX42GMryWjZiVHuKiJ9yCVH_1tZURumtC5mTj2tpuRDF3tXcN_VNIYuXY40IG0K7W3KASfJ9DlNIU2jMOkL2U5oEAXLNRRQuNYdEJ7dMPb14nW19JIaM4BMk00xfQ8MFRw0p6-uoh0-e-Q6iAiTwDNN3F7bYMF9qm874qhLWEcOt6dWQgwpdDUVPDi7F07-Ck0zAs48Dg5w4q93vDpFaQMrziJg9aaxN8
Cache-Control: no-cache
Postman-Token: aeca8515-70b1-ef2c-f317-bf66136dccab
我的认证服务器和资源/ web api项目位于不同的解决方案中,并且运行在不同的端口(...不知道这是否重要,但我想我会提到它。
在这一点上,这两个项目正在使用oAuth OWIN中间件(并且几乎没有自定义代码)。中间件在某种程度上是黑盒,只是需要一些帮助来弄清楚我收到此错误消息的原因。
还要注意,我正在两个Visual Studio 2013 Web应用程序项目中运行这两个服务器,这两个项目位于不同的VS 2013解决方案中,在不同的端口上运行。我不确定这是否重要,但我想我会提到它。
先谢谢你。
我刚刚遇到了同样的问题并找到了解决方案:
在注册WebAPI之前,您需要注册OAuth令牌生成器和OAuth令牌消费者。
如果您将其视为管道,则有点道理,其中身份验证/授权应该先于控制器处理任何请求。
太长别读了
appBuilder.UseWebApi(config);
this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);
自
this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);
appBuilder.UseWebApi(config);
我还收到了错误消息“此请求的授权被拒绝”,尽管我没有单独的授权和资源服务器。
我正在使用Ninj的OwinHost,并在配置OAuth之前在Startup中配置了它,如下所示:
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
app.UseNinjectMiddleware(() =>
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
return kernel;
}).UseNinjectWebApi(config);
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(config);
}
我发现将Ninject配置移到最后解决了这个问题,就像这样:
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
ConfigureOAuth(app);
WebApiConfig.Register(config);
app.UseCors(CorsOptions.AllowAll);
app.UseWebApi(config);
app.UseNinjectMiddleware(() =>
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
return kernel;
}).UseNinjectWebApi(config);
}
也许你的问题与你的中间件的启动顺序有关。
在过去的几天里,我面临着完全相同的问题,尽管我在同一台机器上托管了两个应用程序(不同的端口),但如果不添加机器密钥和web.config文件,并确保两个应用中安装了相同的软件包版本号,它就无法工作