Oauth 2.0 Azure API管理和oAuth2的授权

Oauth 2.0 Azure API管理和oAuth2的授权,oauth-2.0,azure-ad-b2c,azure-api-management,Oauth 2.0,Azure Ad B2c,Azure Api Management,我有一个WebAPI(a)托管在Azure上,受Azure B2C(B)保护,它被一个移动应用程序(C)调用-这一切都正常工作 我现在想允许第三方在同一平台上通过API管理访问我的API,但我对身份验证和“受众”感到非常困惑 API管理开发人员门户已根据Azure文档进行配置,因此当开发人员在门户上进行测试调用时,它会提示使用B2C域(B)进行身份验证。为此,它使用一个针对B2C域注册的应用程序 但是,当我想从第三方系统(D)实现API时,我需要允许系统在调用我的API(a)时模拟用户,以便在域

我有一个WebAPI(a)托管在Azure上,受Azure B2C(B)保护,它被一个移动应用程序(C)调用-这一切都正常工作

我现在想允许第三方在同一平台上通过API管理访问我的API,但我对身份验证和“受众”感到非常困惑

API管理开发人员门户已根据Azure文档进行配置,因此当开发人员在门户上进行测试调用时,它会提示使用B2C域(B)进行身份验证。为此,它使用一个针对B2C域注册的应用程序

但是,当我想从第三方系统(D)实现API时,我需要允许系统在调用我的API(a)时模拟用户,以便在域(B)上的经过身份验证的用户上下文中进行操作

我知道B2C还不支持“代表”作为有效流,因此我使用hellojs在客户端上获取一个访问令牌,通过自定义头传递给第三方系统API,然后作为授权头附加到对API的调用中

API管理产品需要一个“订阅密钥”来标识第三方实现可以使用的产品

  • 这是否意味着对于身份验证部分,使用my API的每个第三方系统都将使用相同的oAuth“观众”id,从而使用相同的Active Directory应用程序

  • 对我来说,每个第三方实现在Azure Ad上都会有一个不同的应用程序更合理,但这意味着我的Web API需要识别大量的观众ID并重定向URI

  • 最后,我如何“隐藏”Web API端点,使其不被公众使用?使用观众id肯定会让人们绕过API管理产品

    如果我把术语弄错了,我道歉

    1) 这是否意味着就认证部分而言 使用我的API的第三方系统将使用相同的oAuth“观众”id 因此,相同的Active Directory应用程序

    他们将使用相同的资源/范围id(即受众),例如
    https://yourwebapiAppIDURI/Read
    但它们都有自己的应用程序ID

    2) 对我来说,每个第三方实现 Azure广告上会有不同的应用程序,但这意味着我的Web API 需要识别大量观众ID并重定向 URI

    是的,他们应该将其应用程序注册为B2C身份验证服务器的客户端。 应在AAD门户中设置第三方应用程序,以授权访问您的web API(.“
    访问您的web API名
    ”)。如果您的web API公开了任何作用域,那么也可以委派对这些作用域的访问

    现在,当他们通过将用户重定向到身份验证服务器来启动令牌请求时,他们应该提供他们的客户端id和web API应用程序id URL的资源/范围值,例如
    https://yourwebapiAppIDURI/Read

    这将产生一个具有以下内容的令牌:

    https://yourwebapiAppIDURI/


    scp
    读取的
    正常,因此B2C不使用同意:

    Azure AD B2C不会征求您的客户端应用程序用户的同意。相反,所有许可都由管理员根据上述应用程序之间配置的权限提供。如果撤销了应用程序的权限授予,则以前能够获得该权限的所有用户将不再能够获得该权限


    谢谢@iandayman。你能澄清一下资源/范围id吗?Azure文档总是说“访问者”值是应用程序id(它是一个guid字符串),但你是说它更像一个url?此外,他们如何将其应用程序注册为客户端-api管理不允许在Active Directory上创建客户端,我是否每次都需要手动执行此操作?此github repo有一个示例:基本上,您可以根据请求在
    范围中输入Web api应用程序ID URI,但是正如您所说的,令牌中的
    受众
    将是与该web API关联的相应应用程序ID Guid。这仍然意味着API管理只需要在受众中检查Web API的Guid。好的-我想我现在已经知道了。唯一没有发生的事情是它触发了同意屏幕?我在scope参数中指定了“openid”,然后指定了我需要的作用域,我可以看到它们被传递,但我从来没有看到同意屏幕?