如何从单页应用程序实施OAuth 2.0授权代码授予?

时间:2019-02-01 01:24:12

标签: c# asp.net angular oauth-2.0 owin

我们有一个由ASP.NET Web API支持的Angular SPA,该API使用OAuth 2.0 Resource Owner Password Credentials Grant和Bearer Token进行授权。该API使用Microsoft.Owin.Security.OAuth来实现OAuth。

我们正在尝试与将使用Authorization Code Grant的第三方应用程序集成,以便用户可以授权它代表他们访问我们的应用程序。

我们希望授权页面成为SPA的一部分,但是我在弄清楚如何将SPA中的授权请求提交到API并将其重定向回第三方应用程序时遇到困难。

我尝试同时使用AJAX(与SPA中的所有其他API请求一样)和常规HTML形式(以便重定向响应重定向页面)。

我们最初是从API发送回JSON响应,然后让SPA自行进行重定向,但是OWIN会在出现错误时自动发送重定向响应。因此似乎没有任何方法可以避免重定向响应。

如果我通过AJAX发送请求,浏览器将通过发送另一个AJAX请求而不是重定向页面来自动跟踪服务器发送的重定向响应。

如果我使用常规HTML表单发送请求,似乎没有任何方法可以发送带有Bearer Token的必需 public function ctrNewSearch($word){ $table = "searchs"; $response = SearchModel::mdlShowSearchs($table); $foundWord = 0; $amount= "1"; foreach ($response as $key => $value) { if ($value["word"] == $word) { $foundWord = 1; $id = $value["id"]; $updatedAmount= $value["amount"] + 1; } if ($foundWord == 1){ $response1= SearchModel::mdlUpdateSearch($table, $word, $id, $updatedAmount); $foundWord = 0; return $response1; } else { $response0 = SearchModel::mdlAddSearch($table, $word, $amount); return $response0; } } } } 头。

1 个答案:

答案 0 :(得分:0)

我最终使用了HTML表单,并在表单主体中发送了当前访问令牌。我在访问令牌的表单中创建了一个隐藏的输入,并且仅在提交表单时设置其值(以减少用户或恶意脚本/扩展看到它的机会)。

在服务器端,我们的OAuth代码以前只在Authorization标头中查找访问令牌;我将其更改为也可以在请求表单(IOwinRequest.ReadFormAsync)中查找授权码请求。

OAuth代码现在将重定向响应发送到成功的授权代码请求,而不是发送带有重定向URI的JSON响应。