【问题标题】:Assign a role to a client secret in a private application将角色分配给私有应用程序中的客户端密码
【发布时间】:2020-02-15 12:08:01
【问题描述】:

在本地应用程序中,我们尝试访问我们在 Azure 中作为私有应用程序托管的 API。我们通过 AAD 为用户分配角色,并且角色在应用程序清单中定义

"appRoles": [    
...
    {
        "allowedMemberTypes": [
            "User",
            "Application"
        ],
        "description": "Read Only All",
        "displayName": "Read Only All",
        "id": "***",
        "isEnabled": true,
        "lang": null,
        "origin": "Application",
        "value": "ReadOnlyAll"
    }
],

我们已经创建了客户端密码,虽然我们可以按照MSAL client credential flows 上的文档连接到公共应用程序,但是这样做我们失去了分配角色的能力。此外,我可以连接到Authenticating to Azure AD in daemon apps with certificates 之后的私有应用程序,但我们收到一条错误消息,指出客户端应用程序没有分配给服务应用程序的角色。所以在这一点上,我们不知道如何从 Azure 获取令牌,并分配给客户端应用程序的角色。

没有直接的方法(据我们所知)可以通过证书和机密、API 权限或授权的客户端应用程序将客户端应用程序角色分配给私有应用程序。

总而言之,我的问题是是否可以将角色分配给本地客户端应用程序,该应用程序从 Azure 上托管的服务应用程序读取数据。

感谢您的帮助!

【问题讨论】:

  • 您无法添加应用权限?添加所需应用权限的选项是否灰显?
  • @juunas 抱歉,您必须说得更具体一些,我不知道您指的是哪个部分。在企业应用程序 > 用户和组中,无法将角色分配给客户端密码。 Azure 广告 > 应用注册下的 API 权限不提供将角色分配给委派应用程序的方法,并且应用程序权限不可用
  • 听起来您的应用已注册为公共客户端?您的本地应用是什么类型的应用?
  • @juunas 应用程序注册为私有客户端,本地应用程序是部署到 IIS 的 .Net 应用程序。您知道是否可以将角色分配给使用私有应用程序已知的客户端密码的应用程序?是否通过 Azure 广告 > 应用注册 > 我的 API > 应用程序权限来引用并将角色分配给应用程序?
  • 是的,应用权限在后台被称为应用角色。那是你应该做任务的地方。

标签: .net azure authentication oauth-2.0 msal


【解决方案1】:

所以为了自己解决这个问题,我使用了来自 @junnas 的 cmets 来帮助我获得适用于我的应用程序的身份验证流程。

我已经为本地应用程序部署注册了私有应用程序,并在 Azure 广告 > 应用程序注册 > 我的 API > 应用程序权限中分配了应用程序应用程序权限(一个角色) 这需要在具有

的 azure 应用程序中扮演角色
"allowedMemberTypes": [
            "User",
            "Application" 
        ],

并且为本地应用程序部署注册的应用程序是私有的。

通过分配给应用程序的角色,我可以按照 v2 oauth 2.0 client credential grant flow 上的文档格式化我的身份验证流程。本质上是使用带有客户端密码和新范围的本地注册应用程序来获取所需的身份验证(承载令牌),以使用 MSALAuthenticator 库以角色连接到私有 azure 应用程序

public MSALAuthenticator()
{
    _onPremClientId = "***";
    _tenantId = "***";
    _authorityFormat = "https://login.microsoftonline.com/{0}/v2.0";
    _onPremClientSecret = "***";
    _scope = _onPremClientId + "/.default";

    _confAuthClient = ConfidentialClientApplicationBuilder.Create(_onPremClientId)
        .WithAuthority(string.Format(_authorityFormat, _tenantId))
        .WithClientSecret(_onPremClientSecret)
        .Build();

   authResult = await _confAuthClient.AcquireTokenForClient(new[] { _scope }).ExecuteAsync();

    //this will be the authentication information, including bearer token for authentication headers to uses in api requests
    return authResult;
}

【讨论】:

    【解决方案2】:

    如果您想将企业应用角色分配给您在“应用注册”中注册的应用,AFAK,我们无法在 Azure 门户上执行此操作,但我们可以通过 Azure AD Powershell 完成此过程,请尝试以下命令:

    Connect-AzureAD 
    
    $appObjId = "object id of the app that you want to assign role to"
    $roleOwnerAppObjId = "object id of the role owner app" 
    
    $sp = Get-AzureADServicePrincipal -ObjectId $roleOwnerAppObjId
    
    $role= $sp.AppRoles | Where-Object { $_.DisplayName -eq "Read Only All" }
    
    New-AzureADServiceAppRoleAssignment -ObjectId $appObjId -PrincipalId $appObjId -ResourceId $sp.ObjectId -Id $role.Id 
    

    您可以在此处找到对象 ID:

    一旦我分配了角色,如您所见,当我请求访问令牌以访问角色所有者应用程序的资源时,将添加角色声明:

    如果有任何不清楚或误解,请随时告诉我。

    【讨论】:

    • 嗨@AdamM,对你有帮助吗?
    • 虽然它可能会有所帮助,但我使用了来自 @junnas 的 cmets 来帮助我获得正确的身份验证流程。
    猜你喜欢
    • 2021-01-03
    • 2017-08-13
    • 2022-01-17
    • 2020-09-28
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多