使用Openiddict进行用户身份管理和应用程序访问

时间:2018-09-17 19:20:36

标签: openiddict

我有一个.NET Core Web API,它使用openiddict进行身份管理,该身份管理与SQL Server后端中的ASP.NET身份相关。许多应用程序可以通过订阅使用此API。我有以下要求。

  1. 只有授权的应用程序可以使用API​​
  2. 每个应用程序都可以选择使用API​​的身份功能来管理其特定于应用程序的用户,这由API中的Openiddict实现(当前已启用授权,密码和刷新令牌流)。
  3. 由于API中的多租户支持,所有端点均应要求应用程序位于Oppenidict应用程序表中,并且该应用程序ID应在每个请求中均可用。
  4. 具有[Authorize]属性的端点必须具有通过Openiddict身份模型进行身份验证的用户。

要实现要求(1),我是否需要实现一个自定义授权功能来检查应用程序机密,还是应该在openiddict中启用另一个流程,以确保仅允许授权的应用程序访问API(无论授权属性)?在这种情况下,可能不会对用户进行身份验证,但是应用程序仍必须有权访问API的未授权端点。

要实现外部身份提供者的要求(2),是否可以为openiddict中注册的每个应用程序配置多个秘密,以允许其用户利用facebook或twitter进行身份验证?这很重要,因为在配置过程中,API将需要为每个可以访问API的应用程序(而不是API本身的clientID和密码)调用AddFacebook()。因为每个应用程序都有各自的facebookID和密码,所以我假设只有在openiddict可以通过AddFacebook()允许针对同一提供者类型注册多个ID和密码的情况下,此方法才起作用。

要实现要求(3),是否有一种内置的方法可以从openiddict获取调用应用程序的应用程序ID,就像用户是否已通过身份验证一样?

1 个答案:

答案 0 :(得分:0)

  

要实现要求(1),我是否需要实现一个自定义授权功能来检查应用程序机密,还是应该在openiddict中启用另一个流程,以确保仅允许授权的应用程序访问API(无论授权属性)?

从RC3开始,默认情况下必须强制执行客户端标识:如果您不发送与Applications表中的条目相对应的client_id,则OpenIddict本身将拒绝您的请求。在以前的版本中,您可以通过调用options.RequireClientIdentification()(现在已退出)来选择此功能。

  

要实现外部身份提供者的要求(2),是否可以为openiddict中注册的每个应用程序配置多个秘密,以允许其用户利用facebook或twitter进行身份验证?这很重要,因为在配置过程中,API将需要为每个可以访问API的应用程序(而不是API本身的clientID和密码)调用AddFacebook()。因为每个应用程序都有各自的facebookID和密码,所以我假设只有在openiddict可以通过AddFacebook()允许针对同一提供者类型注册多个ID和密码的情况下,此方法才起作用。

OpenIddict与您使用的身份验证方案之间没有直接关系,因此不,您不能通过“ OpenIddict”“通过”配置多个Facebook凭据,因为两者是不相关的。

假设您出于多租户目的需要它,您可能需要阅读https://stackoverflow.com/a/49682427/542757,以了解如何覆盖ASP.NET Core的默认选项监视器,以便为身份验证处理程序(如OpenIddict,Facebook, Google和其他任何东西。

  

要实现要求(3),是否有一种内置的方法可以从openiddict获取调用应用程序的应用程序ID,就像用户是否已通过身份验证一样?

假设它是已知的(即,您没有在OpenIddict选项中明确地使客户端标识为可选),是的。例如,来自MVC控制器:

var result = await HttpContext.AuthenticateAsync(OpenIddictValidationDefaults.AuthenticationScheme);
Debug.Assert(result.Ticket != null, "The authentication ticket shouldn't be null.");

// The presenters list contains the authorized parties allowed to
// use the access token with your APIs. Usually, it contains a single value.
// Note: this extension requires a using for AspNet.Security.OpenIdConnect.Extensions.
var client = result.Ticket.GetPresenters().FirstOrDefault();