【问题标题】:Is it possible to use an external Identity Provider in a Web API with ASP.NET 5?是否可以在带有 ASP.NET 5 的 Web API 中使用外部身份提供程序?
【发布时间】:2016-01-07 19:01:31
【问题描述】:

阅读this question、@Pinpoint 的回答以及对 cme​​ts 的进一步讨论,我很清楚,我们无法在使用 ASP.NET 5 开发的应用程序中添加身份提供程序。一种可能替代旧版 OAuthAuthorizationServerMiddleware然后由 AspNet.Security.OpenIdConnect.Server 提供,正如我在很多地方发现的那样。

现在,有一点我仍然不确定这一切,因为我真的不是安全专家,所以我对 OAuth 的了解不是很深。我的疑问如下:在使用 OAuth 保护一个 RESTful API 时是否可以使用外部身份提供者?

请注意,我不是谈论将社交登录添加到一个网站,我谈论的是在一个 RESTful API。

我的意思是,这让我有点困惑,因为我一直认为这应该是我的应用程序关心的问题。

所以我的问题是:当使用 OAuth 和 ASP.NET 5 时,是否可以使用外部身份提供者,而不是实现一个?如果可能的话,简而言之,这是如何工作的?我的意思是,我的应用仍然需要能够管理用户的身份,也就是说它需要管理声明等。

那样的话,如果真的可以的话,流程会怎样?外部身份提供者应该颁发令牌吗?但是我的应用如何能够验证这些令牌并管理用户身份?

编辑:我不确定的原因之一是,当我们使用UseOAuthAuthentication 扩展方法时,我们设置了一个回调路径,描述为

将返回用户代理的应用程序基本路径中的请求路径。当请求到达时,中间件会对其进行处理。

现在,如果我们正在开发一个网站,那么这确实很有意义。该人去那里,单击一个按钮以使用 Facebook 等提供商登录。用户被重定向到 Facebook 的页面,然后在他登录后,他被重定向到该网站的某个页面。

另一方面,对于 RESTful API,这是没有意义的。没有被重定向的概念。

这使得外部提供程序的使用似乎仅适用于网站,而不适用于 RESTful API。这是我问题的重点。

【问题讨论】:

  • 但是第 3 方登录涉及打开第 3 方授权网页,例如“您要允许 xyz 应用访问您的帐户信息吗?”。你想如何克服这个问题?你需要在浏览器上下文中 afaik

标签: asp.net rest oauth asp.net-identity asp.net-core


【解决方案1】:

我的疑问如下:在使用 OAuth 保护一个 RESTful API 时是否可以使用外部身份提供者?

是的,这绝对是可能的。这正是您在使用 Azure Active Directory 保护 API 端点时所做的:

app.UseOAuthBearerAuthentication(options => {
    options.AutomaticAuthenticate = true;
    options.Authority = "https://login.windows.net/tushartest.onmicrosoft.com";
    options.Audience = "https://TusharTest.onmicrosoft.com/TodoListService-ManualJwt";
});

下一个合理的问题是:如果您可以使用 AAD 颁发的令牌来保护您的 API,为什么不能使用 Facebook 或 Google 令牌做同样的事情?

与 Facebook 或 Google 不同,AAD 发布完全标准化的令牌,命名为 JWT 令牌,OAuth2 不记名中间件可以“读取”和“验证”以确定令牌是否仍然存在有效并且确实是为您的 API 发出的(即,如果附带令牌的受众对应于您的 API。您可以在发出授权请求时使用 resource 参数控制此值)。

您不能对 FB 或 Google 令牌做类似的事情,因为它们完全不透明。实际上,这并不奇怪,因为这些令牌只有一个目标:允许您查询 FB 或 Google API,而不是您自己的(这些社交提供者不允许设置访问令牌的受众)。

由于您自己无法读取令牌,因此唯一的选择是询问 FB 或 Google 是否仍然有效,以确保您的 API 不接受无效令牌。这就是您可以(轻松)使用 Facebook 做的事情,因为他们提供了一个“令牌检查端点”,您可以查询:https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow(请参阅检查访问令牌一章)。这样就可以保证token没有过期,确定token对应的用户。

遗憾的是,这种方法有两个缺点:

  • 您必须对 Facebook 端点进行额外的 HTTP 调用以验证访问令牌,这意味着缓存接收到的令牌以避免过多请求淹没 Facebook。
  • 由于访问令牌不是为您自己的 API 颁发的,您必须绝对确保访问令牌已颁发给您完全信任的客户端应用程序,否则它将允许任何第三方开发人员使用他自己的 FB/Google 令牌与您的 API,而无需征求用户的同意。这显然是一个主要的安全问题。

您可以在此 SO 答案的最后部分找到更多信息(它适用于 Katana 和关于 Dropbox,但您应该明白这一点):OWIN/OAuth2 3rd party login: Authentication from Client App, Authorization from Web API


所以我的问题是:当使用 OAuth 和 ASP.NET 5 时,是否可以使用外部身份提供者,而不是实现一个?如果可能的话,简而言之,这是如何工作的?我的意思是,我的应用仍然需要能够管理用户的身份,因为它需要管理声明等。

那样的话,如果真的可以的话,流程会怎样?外部身份提供者应该颁发令牌吗?但是我的应用如何能够验证这些令牌并管理用户身份?

要解决上一部分中提到的限制,最好的选择是 - 正如您已经想到的那样 - 创建自己的授权/身份验证服务器。这样,您的 API 不会(直接)接受 FB 或 Google 令牌,而是您自己的服务器发出的令牌,这可能会将您的用户重定向到 FB 或 Google 进行身份验证。

正是此示例的作用:https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/tree/vNext/samples/Mvc

  • 客户端应用程序 (Mvc.Client) 邀请用户向您的授权服务器 (Mvc.Server) 进行身份验证,以便他可以获取访问令牌以稍后查询 API(也在 Mvc.Server 中)。为此,用户将被重定向到您的授权服务器,该服务器本身为您提供 Google 或 Twitter 的身份验证。

  • 完成此外部身份验证步骤后,用户将被重定向回您的授权服务器 (Mvc.Server),并要求他同意客户端应用 (Mvc.Client) 访问他的个人数据。

  • 获得同意后,用户将被重定向回客户端应用程序,并使用可用于查询 API 端点的访问令牌。

【讨论】:

  • 感谢@Pinpoint 的回答。我真的认为新的 Azure API 服务提供了一种“自动”在 API 上实现身份验证的方法,我相信它就像你所说的那样。但是,当我们这样做时,是否可以使用诸如 Identity 之类的东西来管理用户和声明?另外,再次感谢您在授权服务器中间件上的工作!我不是安全方面的专家,所以在 ASP.NET 5 中正确使用 OAuth 变得相当混乱。
  • 理论上应该可以使用claims transformation middleware将访问令牌绑定到您自己的数据库中包含的用户。但在实践中,实施起来可能有点困难,因为您的用户还必须在您自己的应用程序中注册(否则 Identity 将无法为他们找到帐户)。因此,理想情况下,您必须使用具有经典注册流程的 MVC 应用程序并使用带有 AAD 的 app.UseOpenIdConnectAuthentication() 来登录您的用户。这类似于默认身份模板中的“Google”或“Facebook”流程。
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 2016-11-18
  • 2019-04-26
  • 1970-01-01
  • 2017-02-02
  • 2014-07-13
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多