【问题标题】:Scope for multiple web apis多个 Web API 的范围
【发布时间】:2017-10-09 05:52:37
【问题描述】:

我的 b2c 上有 2 个 Web api(A 和 B)。他们每个人分别发布自己的权限(scopeA1,scopeA2)和(scopeB1,scopeB2)。

在我的 Web 应用程序(已配置并已授予对 api 和 4 个范围的访问权限)上,为了在身份验证期间获取两个 api 的授权代码,我尝试将我的 OpenIdConnectAuthenticationOptionsin 范围属性设置为包括 4 个范围. 我收到错误 AADB2C90146:请求中提供的范围 'scopeA1 scopeA2 scopeB1 scopeB2 openid offline_access' 为访问令牌指定了多个资源,这是不受支持的。

如果我只为 web api A 或 B 指定范围,那么它会按照 this link 工作

如何让我的 Web 应用程序同时使用这两个 Web api,即使两者都授予了权限

感谢您的帮助

【问题讨论】:

    标签: azure-active-directory azure-ad-b2c


    【解决方案1】:

    如果这两个 Web API 是 Azure AD 中的单独应用程序,则需要分别为它们请求访问令牌。

    我不熟悉您用作起点的示例,但看起来这些行是您需要进行更改的地方:

    // Retrieve the token using the provided scopes
    ConfidentialClientApplication app = new ConfidentialClientApplication(authority, Startup.ClientId,
                                        Startup.RedirectUri, credential,
                                        new NaiveSessionCache(userObjectID, this.HttpContext));
    AuthenticationResult result = await app.AcquireTokenSilentAsync(scope);
    
    accessToken = result.Token;
    

    您应该为每个 API 创建一个 app 实例,并为每个 API 获取一个令牌。然后,当您在其他地方调用 API 时,请在 Bearer 身份验证标头中使用正确的访问令牌。

    【讨论】:

    • 谢谢。是的,它们是 AD 上的不同资源。我将如何在 OWIN 管道中执行此操作,因为我仅在用户登录后才收到授权码?
    • 我不确定我的担忧在问题中是否明确。目的是查看在用户登录期间登录策略生效时如何获取授权码。这就是我想在不同的 api 上要求不同范围的地方。但是 OpenIdConnectAuthenticationOptions 的范围属性此时不能采用所有不同的范围(我有上面解释的问题 AADB2C90146)。
    【解决方案2】:

    我遇到了同样的问题并问了类似的问题Extend MSAL to support multiple Web APIs

    但我还没有答案,基本上是为了在短期内解决这个问题,我让我的两个 API 使用相同的授权客户端 ID + 机密,因此我可以在我的 APIS 中重用相同的范围

    这不是我想要的,但如果你想使用 Azure AD B2C,你需要习惯妥协一段时间,直到获得支持

    -- 我还要说您使用的是旧版本的 MSAL,我也在使用,我等到版本 1 发布后再升级。

    github上讲过使用这种格式

    https://github.com/AzureAD/microsoft-authentication-library-for-dotnet

    Step 1: Add MSAL to your Solution/Project
    Right click on your project > Manage packages.
    Select include prerelease > search msal.
    Select the Microsoft.Identity.Client package > install.
    
    Step 2: Instantiate MSAL and Acquire a Token
    Create a new PublicClientApplication instance. Make sure to fill in your 
    app/client id
    PublicClientApplication myApp = new PublicClientApplication(CLIENT_ID);
    Acquire a token
    AuthenticationResult authenticationResult = await 
    myApp.AcquireTokenAsync(SCOPES).ConfigureAwait(false);
    
    Step 3: Use the token!
    The access token can now be used in an HTTP Bearer request.
    

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      • 2017-11-19
      相关资源
      最近更新 更多