我得到了#34;此请求已拒绝授权。"使用OWIN oAuth中间件(具有单独的Auth和资源服务器)时出现错误消息

时间:2014-10-20 04:55:41

标签: asp.net asp.net-web-api oauth oauth-2.0 owin

我正在尝试解析我的身份验证和资源服务器。我按照本教程中提供的示例进行操作:

http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/

这是我的auth服务器中的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 Startup
   {
      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());

      }
   }
}

这是我资源服务器中的startup.cs(即我的示例Web api应用程序):

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"我的auth服务器的端点我成功收到一个令牌:

{
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

我的auth服务器和资源/ web api项目采用不同的解决方案,并且在不同的端口上运行(...不确定这是否重要,但我认为Id提及它。)

此时,这两个项目正在使用oAuth OWIN中间件(并且只有很少的自定义代码)。中间件在某种程度上是黑盒子,只需要一些帮助就可以找出我收到此错误消息的原因。

另请注意,我在两个运行在不同端口上的VS 2013解决方案中的Visual Studio 2013 Web应用程序项目中运行这两个服务器。我不确定这是否重要,但我想我会提到它。

提前致谢。

8 个答案:

答案 0 :(得分:24)

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

您需要在注册WebAPI之前注册OAuth令牌生成器和OAuth令牌使用者事物

如果您认为这是一个管道,那么有意义的是,在控制器处理任何请求之前,应该进行身份验证/授权。

TL; DR:改变

appBuilder.UseWebApi(config);

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

this.ConfigureOAuthTokenGenerator(appBuilder);
this.ConfigureOAuthConsumer(appBuilder);

appBuilder.UseWebApi(config);

答案 1 :(得分:14)

虽然我没有单独的身份验证和资源服务器,但我还收到错误消息'此请求已被拒绝授权'。

我正在使用Ninject的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);
}

也许您的问题与中间件的启动顺序有关。

答案 2 :(得分:4)

在我的帖子中,我很清楚您需要覆盖两个API(授权服务器和资源服务器)的machineKey节点,并在两个web.config文件之间共享相同的machineKey。你如何举办这两个不同的项目?他们在同一台机器或不同的机器上? 请从帖子返回第5步,检查如何实现这一目标。

答案 3 :(得分:3)

我在过去几天遇到了完全相同的问题,虽然我在同一台机器上安装了两个应用程序(不同的端口),但是如果没有添加机器密钥web.config文件它就无法工作确保两个应用程序中安装了相同的软件包版本号

答案 4 :(得分:3)

对我来说,问题是Owin packeges版本号不匹配:

 <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>
  <dependentAssembly>
    <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
  </dependentAssembly>

更新所需的旧软件包后,一切都像魅力一样。 :)

答案 5 :(得分:1)

在你的OwinStartup类中,需要在IAppBuilder.UseWebApi()

之前调用IAppBuilder.UseOAuthBearerTokens()
public void Configuration(IAppBuilder app)
{
    app.UseOAuthBearerTokens(...);
    app.UseWebApi(...);
}

答案 6 :(得分:1)

2018年6月6日更新 - 使用最新的WebAPI和OWIN软件包。 我一直在抨击这个问题,而不是我想承认的。以上建议都没有对我有用,一旦我添加了某个项目依赖突然开始工作,我甚至不能在我的代码中使用 Microsoft.Owin.Host.SystemWeb NuGet封装即可。这个设置过于挑剔,黑盒子符合我的口味,我不知道它为什么会这样,但这就是我的所作所为。

资源服务所需的最小设置(已设置身份验证/令牌服务):

  • 添加对Microsoft.Owin.Security.OauthMicrosoft.Owin.Host.SystemWeb
  • 的引用
  • 使用以下内容创建一个startup.cs文件:

    using Microsoft.Owin;
    using Owin;
    using Microsoft.Owin.Security.OAuth;
    
    [assembly: OwinStartup(typeof(MyProject.Startup))]
    
    namespace MyProject
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions{ });
            }
        }
    }
    
  • 将以下内容添加到Web.config部分的<appSettings>文件中

<add key="owin:appStartup" value="MyProject.Startup" />

答案 7 :(得分:0)

在具有不同池的IIS中运行Web应用程序,您将获得不同的密钥。因此,您应该使用相同的应用程序池运行身份验证和资源应用程序。选中此https://gyorgybalassy.wordpress.com/2013/12/07/how-unique-is-your-machine-key/