我正在尝试解析我的身份验证和资源服务器。我按照本教程中提供的示例进行操作:
这是我的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应用程序项目中运行这两个服务器。我不确定这是否重要,但我想我会提到它。
提前致谢。
答案 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.Oauth
和Microsoft.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" />
machineKey
部分的Web.config
文件中添加<system.web>
条目。如果你需要生成它,搜索一下,那里有很多信息。您可以将此作为起点:http://bitoftech.net/2014/09/24/decouple-owin-authorization-server-resource-server-oauth-2-0-web-api/ [Authorize]
属性添加到控制器/路由。答案 7 :(得分:0)
在具有不同池的IIS中运行Web应用程序,您将获得不同的密钥。因此,您应该使用相同的应用程序池运行身份验证和资源应用程序。选中此https://gyorgybalassy.wordpress.com/2013/12/07/how-unique-is-your-machine-key/