是否可以在 Web API 和 ASP.NET 5 中使用外部身份提供者?

Is it possible to use an external Identity Provider in a Web API with ASP.NET 5?

阅读 、@Pinpoint 的回答和对评论的进一步讨论,我很清楚我们无法在使用 ASP.NET 开发的应用程序中添加身份提供者 5. 一遗留 OAuthAuthorizationServerMiddleware 的可能替代品由 AspNet.Security.OpenIdConnect.Server 提供,正如我在许多地方发现的那样。

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

请注意,我不是谈论向一个网站添加社交登录,我是在谈论使用一个外部身份提供商在一个 RESTful API.

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

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

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

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

The request path within the application's base path where the user-agent will be returned. The middleware will process this request when it arrives.

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

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

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

My doubt is the following: is it possible to use an external identity provider when using OAuth to protect one 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 令牌做类似的事情,因为它们是完全不透明的。实际上,这并不奇怪,因为这些令牌只有一个 objective:允许您查询 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


So my question here is: when using OAuth and ASP.NET 5, is it possible to use an external identity provider, other than implementing one? If it is possible, how this works in short? I mean, my app still needs to be able to manage the identities of users, in the sense that it needs to manage claims and so on.

In that case, if it is really possible, how the flow would be? The external identity provider should issue the tokens? But how my app would be able to verify those tokens and manage users identities?

要解决上一部分中提到的限制,最好的选择是 - 正如您已经想到的那样 - 创建您自己的 authorization/authentication 服务器。这样,您的 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 端点的访问令牌。