C# OAuth服务器令牌端点返回404

C# OAuth服务器令牌端点返回404,c#,oauth-2.0,asp.net-web-api2,C#,Oauth 2.0,Asp.net Web Api2,我正在研究SPA和web服务之间基于令牌的身份验证和授权。我在这个主题中找到了一些很棒的文章,这些文章都是由我开始构建我的基础设施的人撰写的 资源服务器和身份验证服务器是分开的。身份验证服务器有两个端点: --我可以增加新的听众 --我可以生成令牌 第一个可以正常工作,所以我可以注册新的观众。我对第二个有意见。它总是返回404 public void ConfigureOAuth(IAppBuilder-appBuilder) { OAuthAuthorizationServerOption

我正在研究SPA和web服务之间基于令牌的身份验证和授权。我在这个主题中找到了一些很棒的文章,这些文章都是由我开始构建我的基础设施的人撰写的

资源服务器和身份验证服务器是分开的。身份验证服务器有两个端点:

  • --我可以增加新的听众
  • --我可以生成令牌
第一个可以正常工作,所以我可以注册新的观众。我对第二个有意见。它总是返回404

public void ConfigureOAuth(IAppBuilder-appBuilder)
{
OAuthAuthorizationServerOptions OAuthServerOptions=新的OAuthAuthorizationServerOptions()
{
//仅适用于开发环境
//待办事项
AllowInsecureHttp=true,
TokenEndpointPath=新路径字符串(“/services/oauth2/token”),
AccessTokenExpireTimeSpan=TimeSpan.FromMinutes(30),
Provider=新的CustomOAuthProvider(),
AccessTokenFormat=新的CustomJwtFormat(“http://dev.dilib.local")
};
使用OAuthAuthorizationServer(OAuthServerOptions);
}
正如你所看到的,这与泰瑟在他的文章中所写的几乎相同

到目前为止,我所做的工作是为了找出它不能按预期工作的原因:

  • 我仔细检查了我编码的代码,没问题
  • 我在谷歌上搜索了一下,有几个人遇到了这个问题,但答案只表明他们可以解决这个问题,没有人努力写下他/她做了什么
  • 我更改了TokenEndpointPath几次,以避免它可能与我机器上运行的其他服务冲突,但是,我很抱歉,我的机器上没有任何其他服务
  • 我读过OAuth端点并不完全是一个服务端点,我看到了一段代码片段,但整篇文章都是关于CORS的,我不想把所有内容都混在一起
  • 我检查了IIS日志,除了特定帖子和404
  • 我检查了事件查看器,什么都没有
  • 我在这里检查了相关问题,但什么都没有

所以,我没心思了,我想我做了些傻事,我想请你帮忙

您提到oauth2令牌端点URI如下所示,但您的代码段没有这样说,因为您创建的“TokenEndpointPath”变量中的代码似乎缺少“authentication”字符串。我已将更正后的代码粘贴到下面。我不确定你的问题是否那么简单:)

身份验证/oauth2/token


哦,我在这里贴错代码了。你说得对,他们不匹配。然而,这不是问题所在。我还不知道是什么问题。当我开始处理这个问题时,我的机器晚上没有动过,令牌端点对最初的几个请求进行了响应,之后我又得到了404。我阅读了另一个由Taissen编写的教程,现在我有了一个工作令牌端点,但它没有与webapi服务器分离。我现在很高兴。稍后,我将花一点时间对其进行重构。正如您提到的“令牌端点对前几个请求进行了响应,之后我又得到了404”,我认为这种行为与“用户在给定的时间内发送了太多请求(“速率限制”)有关。在一定时间内,您可以发送的请求数量似乎有限制。然而,在这种情况下,服务器应该返回“429”http状态,而不是“404”。@SayusiAndo很高兴我的帖子很有用,但我想在Web API项目中默认情况下并没有应用速率限制,应该实现一些限制和速率限制的功能。
OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                //only dev environment
                //TODO
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/services/authentication/oauth2/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
                Provider = new CustomOAuthProvider(),
                AccessTokenFormat = new CustomJwtFormat("http://dev.dilib.local")
            };