API 端点返回“此请求的授权已被拒绝”。发送不记名令牌时

2024-02-25

我已按照教程使用 C# 中的 OAuth 保护 Web API。

我正在做一些测试,到目前为止我已经能够成功地从/token。我正在使用名为“Advanced REST Client”的 Chrome 扩展来测试它。

{"access_token":"...","token_type":"bearer","expires_in":86399}

这就是我从中得到的/token。一切看起来都不错。

我的下一个请求是向我的测试 API 控制器发出的:

namespace API.Controllers
{
    [Authorize]
    [RoutePrefix("api/Social")]
    public class SocialController : ApiController
    {
      ....


        [HttpPost]
        public IHttpActionResult Schedule(SocialPost post)
        {
            var test = HttpContext.Current.GetOwinContext().Authentication.User;

            ....
            return Ok();
        }
    }
}

该请求是一个POST并有标题:

Authorization: Bearer XXXXXXXTOKEHEREXXXXXXX

I get: Authorization has been denied for this request.以 JSON 形式返回。

我也尝试执行 GET 操作,得到了我所期望的结果,即该方法不受支持,因为我没有实现它。

这是我的授权提供者:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
    }

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {

        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        using (var repo = new AuthRepository())
        {
            IdentityUser user = await repo.FindUser(context.UserName, context.Password);

            if (user == null)
            {
                context.SetError("invalid_grant", "The user name or password is incorrect.");
                return;
            }
        }

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
        identity.AddClaim(new Claim(ClaimTypes.Role, "User"));

        context.Validated(identity); 

    }
}

任何帮助都会很棒。不知道是请求错误还是代码错误。

编辑: 这是我的Startup.cs

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        var config = new HttpConfiguration();
        WebApiConfig.Register(config);
        app.UseWebApi(config);
        ConfigureOAuth(app);
    }

    public void ConfigureOAuth(IAppBuilder app)
    {
        var 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());

    }
}

问题很简单:更改 OWIN 管道的顺序.

public void Configuration(IAppBuilder app)
{
    ConfigureOAuth(app);
    var config = new HttpConfiguration();
    WebApiConfig.Register(config);
    app.UseWebApi(config);
}

对于 OWIN 管道,您的配置顺序非常重要。在您的情况下,您尝试在 OAuth 处理程序之前使用 Web API 处理程序。在其中,您验证您的请求,发现您的安全操作并尝试根据当前的情况验证它Owin.Context.User。此时该用户不存在,因为它是通过稍后调用的 OAuth 处理程序从令牌设置的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

API 端点返回“此请求的授权已被拒绝”。发送不记名令牌时 的相关文章

  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • 我担心我添加了太多接口

    我正在构建我的领域模型并继续重构它 正如我所做的那样 我发现我喜欢接口 因为它允许我根据接口为具体类型创建可重用的方法 控制器 视图 但是 我发现每次向域实体之一添加新属性时 我都会创建一个接口 例如 我有一个会员状态从抽象继承的对象Ent
  • 如何在 C# 中以编程方式将行添加到 DataGrid?

    正如标题所述 我正在尝试使用 C 以编程方式将行添加到 DataGrid 但我似乎无法使其工作 这是我到目前为止所拥有的 I have a DataGrid declared as dg in the XAML foreach string
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • 使用 STL 流时如何格式化我自己的对象?

    我想将我自己的对象输出到 STL 流 但具有自定义格式 我想出了这样的东西 但由于我之前从未使用过 locale 和 imbue 所以我不知道这是否有意义以及如何实现 MyFacet 和operator 所以我的问题是 这是否有意义以及如何
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 将同步 zip 操作转换为异步

    我们有一个现有的库 其中一些方法需要转换为异步方法 但是我不确定如何使用以下方法执行此操作 错误处理已被删除 该方法的目的是压缩文件并将其保存到磁盘 请注意 zip 类不公开任何异步方法 public static bool ZipAndS
  • NHibernate:无状态会话错误消息无法获取代理

    我正在使用 nHibernate 无状态会话来获取对象 更新一个属性并将对象保存回数据库 我不断收到错误消息 无状态会话无法获取代理 我在其他地方有类似的代码 所以我不明白为什么这不起作用 有谁知道问题可能是什么 我正在尝试更新Screen

随机推荐

  • Interface Builder 不断重置我的自定义 UITableViewCell 的宽度

    我正在使用 Interface Builder 设计自定义 UITableViewCell对于 iPad 应用程序 我有一个专用的 XIB 文件 其中有一个 UITableViewCell 作为其根视图 我可以将 UITableViewCe
  • 根据外键字段在 Django 管理中过滤 list_filter

    我想通过外键指向的表中的字段来过滤我的 list filters 之一 我的模型 class Organisation models Model name models CharField COMPANY COMPANY CHARITY C
  • jQuery 延迟 ajax 缓存

    我读到了最上面的答案这个问题 https stackoverflow com questions 4869609 how can jquery deferred be used关于使用jQuery 延迟 http api jquery co
  • TFS 构建 PowerShell 步骤中的 Robocopy 报告失败但没有错误

    我的 powershell 脚本运行时日志文件中没有报告错误 但 TFS 2015 构建步骤报告错误 我需要执行特殊回电吗 这是一种新的样式构建 而不是基于 XAML 的构建 该脚本没有什么特别的 它调用 robocopy 并且成功发生 这
  • 默认情况下启用 WIX 的 MSI 日志记录

    我目前正在为我的软件编写安装程序 并且真的很想记录安装 我正在使用维克斯 但是 我见过记录安装的唯一方法是更改 reg 作为全局设置 并使用 l v 或类似的东西将其添加为命令行中的命令 我想做的是 安装程序运行后立即记录该安装程序 而不修
  • Werkzeug 引发 BrokenFilesystemWarning

    当我将表单数据发送到 Flask 应用程序时 出现以下错误 它说它将使用 UTF 8 编码 但区域设置已经是 UTF 8 这个错误是什么意思 home virtualenvs project local lib python2 7 site
  • While循环:UnboundLocalError:赋值前引用的局部变量

    我正在使用 python 3 5 因此 我尝试创建一个函数 将 x 和 y 作为正浮点输入 然后计算并返回 R x N y 其中 N 是最大整数 因此 x gt N y 我做了这个功能 def floatme x y N 1 while x
  • 将类型结构的通用列表绑定到中继器

    我在尝试将通用列表绑定到中继器时遇到了一些问题 泛型列表中使用的类型实际上是一个结构体 我在下面构建了一个基本示例 struct Fruit public string FruitName public string Price strin
  • MySQL 崩溃(“某些指针可能无效并导致转储中止”)

    我有一个名为 tweets 的 5GB MySQL 数据库 我需要从中访问 searchresults 表 但是 当我对其执行查询或创建转储时 MySQL 服务器 在 Windows 10 上运行 始终崩溃 并在同一行出现相同的错误 例如
  • Hyperledger Fabric 中的对等通道创建失败

    我正在尝试与一个订购者和 2 个对等方建立一个示例超级账本结构环境 我没有使用 docker 方法 而是运行实际的可执行文件本身 Orderer 和 2 个对等节点已成功启动 但是 通道创建失败并出现以下错误 任何帮助将不胜感激 订购者窗口
  • 比较 Cloud Functions 中的两个 Firestore 时间戳

    我正在 Firestore 中编写更新函数 我想比较两个Timestamp 我尝试了多种方法但没有成功 你能指出我比较两个的正确方法吗Timestamp在消防库里 exports updateFunction functions fires
  • Java监听端口

    我们想要捕获通过端口 7777 到达系统的数据 public static void main String args try final ServerSocket serverSocket new ServerSocket 7777 ne
  • 在 F# 中将字符串相乘

    我有一个问题我不太确定 我的问题如下 let myFunc text string times int 我想要这个函数做的是将字符串放在一起的次数与指定的次数相同times范围 if input check 3我想要输出字符串 check
  • 如何生成x的前20次方?

    所以 我有 X 一个 300 1 向量 我想要 1 X X X X X X X X X 300 20 矩阵 我该怎么做 X 2 1 X X X X X X ans 2 4 8 1 1 1 这可行 但我无法面对将整个内容打出来 我肯定不需要写
  • Jackson 2.2.3 中属性的 getter 定义相互冲突

    为了简单起见 这里是一个简单的类 class GetterMethodsObject int id 10 public int getId return id JsonIgnore public boolean isId return tr
  • 使用相互或循环(循环)导入时会发生什么?

    在 Python 中 当两个模块尝试执行操作时会发生什么import彼此 更一般地说 如果多个模块尝试import在一个循环中 See also What can I do about ImportError Cannot import n
  • LINQ to Entities 查询不支持转换为十进制

    我有一个数据库表事务 transactionID LocalAmount 其中 Localmount 属性的数据类型是float 在用户界面上我试图返回SUM按钮单击事件中一行中的列 Localamount 我用过decimal代替floa
  • 什么是“单位”? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在单元测试的背景下 什么是 单元 我通常将其定义为单一代码执行路径通过单一方法 根据经验法则 测试一个方法所需的单元测试数量等于或大于
  • 透明 UINavigationBar 下的 UIWebView

    我有一个 UIWebView 我想将其放在半透明的 UINavigationBar 下 通常 当我将 UIScrollView 放在半透明的 UINavigationBar 下时 我会设置其 contentOffset 以便所有内容最初都会
  • API 端点返回“此请求的授权已被拒绝”。发送不记名令牌时

    我已按照教程使用 C 中的 OAuth 保护 Web API 我正在做一些测试 到目前为止我已经能够成功地从 token 我正在使用名为 Advanced REST Client 的 Chrome 扩展来测试它 access token t