asp.net - owin oauth




当使用OWIN oAuth中间件(使用单独的Auth和资源服务器)时,出现“授权已被拒绝” (5)

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

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());

      }
   }
}

这是我的资源服务器(即我的示例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);
      }      
   }
}

当我将以下请求发送到auth服务器的“\ token”端点时,我已经成功接收到一个令牌:

{
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应用程序项目中运行了两台服务器。 我不确定这件事情是否重要,但是我想提一提。

提前致谢。


在我的文章中,我很清楚,你需要重写这两个API(Authorization Server和Resource Server)的machineKey节点,并在两个web.config文件之间共享相同的machineKey。 你如何主办这两个不同的项目? 他们在同一台机器或不同的机器上? 请回到帖子的第5步,并检查如何实现这一点。


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

我正在使用Ninject的OwinHost,并在配置OAuth之前在启动时进行配置,如下所示:

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);
}

也许你的问题是关于你的中间件的启动顺序。


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

public void Configuration(IAppBuilder app)
{
    app.UseOAuthBearerTokens(...);
    app.UseWebApi(...);
}

尽管我在同一台计算机(不同的端口)上托管了两个应用程序,但是在没有添加计算机密钥的情况下这两个web.config文件并不起作用,并且确保相同的软件包版本安装在两个应用程序中


我得到了同样的错误。 当我第一次学习Web Api时,我使用Web Api模板创建了一个项目,但是我没有点击Change Authentication按钮。 我应该选择无认证。

另外,删除[Authorize]属性也适用于我。

[Authorize] <--Remove these attributes
public class ValuesController : ApiController




owin