提问者:小点点

使用 OWIN oAuth 中间件(具有单独的身份验证和资源服务器)时收到“此请求的授权被拒绝”错误消息


我正在尝试分离我的身份验证和资源服务器。我遵循本教程中提供的示例:

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解决方案中,在不同的端口上运行。我不确定这是否重要,但我想我会提到它。

先谢谢你。


共3个答案

匿名用户

我刚刚遇到了同样的问题并找到了解决方案:

在注册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文件,并确保两个应用中安装了相同的软件包版本号,它就无法工作