当前位置: 首页 > 知识库问答 >
问题:

对多租户应用程序使用授权代码流不起作用

凤昊东
2023-03-14

我有2个微软tenat AD租户A和tenat B,

我需要通过在租户a下注册的应用程序调用租户B的Azure API(如Azure资源调配、读取Azure数据、调用成本API和其他一些Azure API)。我已经通过以下方式实现了这一点。

>

  • 在租户A下创建了一个多租户应用(仅具有图形API权限)。

    使用此URL通过Authoriziation Code流获取Azure刷新令牌(租户B用户(非管理员)同意租户A应用)

    https://login.microsoftonline.com/common/oauth2/authorize?client_id=

    成功重定向后,我收到了刷新令牌。

    当我尝试使用该刷新令牌获取“https://management.azure.com”的访问令牌时,我遇到了以下错误。

    通用域名格式。微软啊。adal4j。AuthenticationException:{“错误描述”:“AADSTS65001:用户或管理员尚未同意使用ID为'801e6372-f223-4acb-895c-c966a0ff57c6'的名为'AnkitTestMFAApp'的应用程序。请发送此用户和资源的交互式授权请求。\r\n访问ID:0ec48b06-64cf-47ed-b5d7-8725fba91600\r\n相关ID:96d78b24-5442-469a-a798-0f1eace171c1\r\r\nTimestamp:2020-09-20 12:41:09Z”,“错误”。微软啊。adal4j。阿达尔敦请求。在com上执行AuthRequestandProcessResponse(AdalTokenRequest.java:129)。微软啊。adal4j。AuthenticationContext。com上的acquireTokenCommon(AuthenticationContext.java:930)。微软啊。adal4j。可调用的。在com上执行(AcquireTokenCallable.java:70)。微软啊。adal4j。可调用的。在com上执行(AcquireTokenCallable.java:38)。微软啊。adal4j。可调节。在java上调用(AdalCallable.java:47)。util。同时发生的未来任务。在java上运行(未知源代码)。util。同时发生的线程池执行器。java上的runWorker(未知源代码)。util。同时发生的ThreadPoolExecutor$Worker。在java上运行(未知源代码)。朗。丝线。运行(未知源)我正在使用com。微软蔚蓝色的资格证书AzureTokenCredentials类到acuire token。

    即使我使用任何azure java sdk函数

    AzureTokenCredentials=AzureTokenCredentials的自定义实现Azure=Azure。验证(凭证)。使用订阅(cloudAccount.getSubscriptionId());

    自定义实现AzureToken凭据

    @Override public AuthenticationResult getAccessTokenByRefreshToken(String tenantId,String resource,String refreshToken,String clientId,String clientSecret)抛出ExecutionException,InterruptedException,MalformedURLException{AuthenticationContext authContext;AuthenticationResult authResult;ExecutorService=null;Future Future;

        try {
            service = Executors.newFixedThreadPool(1);
            authContext = new AuthenticationContext(MessageFormat.format("{0}/{1}", "https://login.microsoftonline.com", tenantId), true,
                    service);
    
            future = authContext.acquireTokenByRefreshToken(refreshToken, new ClientCredential(clientId, clientSecret),
                    resource, null);
    
            authResult = future.get();
    
            return authResult;
        } finally {
            if (service != null) {
                service.shutdown();
            }
        }
    }
    

    我可以在我的租户B企业应用程序列表下看到此应用程序的服务原则条目。

    可能的问题是什么?应该如何解决?

    请求管理员批准

    应用权限

    同意用户设置

    条件接收详细信息

    同意设置

    将权限添加为低风险部分

  • 共有1个答案

    强保臣
    2023-03-14

    这是因为租户B用户(不是管理员)不同意应用程序的范围https://management.azure.com

    以下是修复它的步骤。

    删除租户B中的企业应用程序,将撤销同意。

    添加权限https://management.azure.com/user_impersonation在租户A的Azure广告应用程序中。

    使用以下字符串获取代码,然后刷新令牌。当您使用租户B用户进行用户同意时,您需要同意https://management.azure.com/user_impersonation权限。

    https://login.microsoftonline.com/common/oauth2/authorize?client_id={your client id}&response_mode=query&response_type=code&redirect_url=https://localhost/&scope=openid https://management.azure.com/.default&state=297e2e0374a6cbfb0174a73dcfce0755&nonce=c6234c0c-ab14-49f4-aa41-827061841d61
    

    这一次刷新令牌将生效,因为您将发现https://management.azure.com/user_impersonation租户B企业应用程序中的权限。

     类似资料:
    • 嗨,我正在探索关于azure active Directory的一些身份验证和授权流。我以前在单页应用程序中使用誓言隐式流。在阅读microsoft文档之后,我已经理解了关于隐式流的以下内容。 隐式流: 单页javacript应用程序使用隐式流从azure active Directory获得获取访问令牌。它直接调用令牌endpoint来获取令牌,因此这使得隐式流不太安全。 NET Web应用程序

    • 我目前正试图找出为我的系统设置多租户的最佳方法。我面临的问题是,租户并不总是必须是子域,但可以作为子域的一部分进行设置,子域可以有多个租户。我似乎在网上找不到任何东西可以帮助我在Laravel 6中进行设置。 系统要求: 一台服务器可以有许多子域 系统必须设置一个数据库,该数据库将使用tenant_id来确定哪些数据属于租户。 我目前正在以以下结构将所有子域数据存储在“subdomains”表中:

    • 我必须在j2ee中开发一个多租户SaaS应用程序,从Iaas和PaaS开始实现三种云模型,我选择了openstack和openshift origin。SaaS应用程序的第一个标准是多租户,我知道有三种方法来实现它——单独的数据库——共享数据库,单独的模式——共享数据库,共享模式。我在这里迷失了方向,因为许多框架,比如ATHENA,ORM,比如hibernate,还有TOPLINK。我需要帮助了解

    • 我已经安装了keycloak-angular包,我使用它的方式如下:https://www.npmjs.com/package/keycloak-angular 问题是,在我的应用程序中,我希望有多租户。这意味着在应用程序加载期间不知道领域名。 在说明中,它说“KeycloakService应该在应用程序加载期间使用APP_INITIALIZER标记初始化”,问题是该领域是由用户给定的,在应用程序

    • EDIT做了一些更多的测试:当我只配置secure-annotations=“enabled”时,基于角色的安全性工作。此外,配置pre-postannotations=“enabled”时,既不安全也不预授权。当我只配置前-后注释时,它仍然不起作用。 编辑2 更多的测试:只有secured_annotations=“enabled”,对channelservice的调用通过Cglib2AopPr

    • 我正在使用spring boot开发一个多租户应用程序。 系统的业务逻辑将根据每个租户进行更改。 例如,应用程序上的特定租户租赁空间可能希望改变使用一些复杂的自定义逻辑计算值的方式。我想为应用程序注册默认行为/依赖项,并允许特定租户覆盖它。 这可以使用Spring Boot完成吗?