我正在开发一个应用程序(核心微服务之一),该应用程序将调用Azure ADLS Gen 2来存储文件(在文件系统中),以供其他组件进一步处理。
我正在尝试通过使用预先创建的服务主体调用Azure身份验证终结点来获取OAuth令牌以进行身份验证。
我用来创建服务主体的PowerShell代码:
Add-AzAccount -Subscription <SUBSCRIPTION ID>
$sp = New-AzADServicePrincipal -DisplayName <PRINCIPAL NAME>
Sleep 20
New-AzRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $sp.ApplicationId
$sp.ApplicationId
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($sp.Secret)
$UnsecureSecret = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
$UnsecureSecret
我将$sp.ApplicationId
的值用作$UnsecureSecret
作为
然后使用API权限配置Azure AD应用程序:
我已将Azure AD应用程序作为STORAGE BLOB DATA CONTRIBUTOR添加到存储帐户的IAM刀片服务器中。
接下来,我要获得OAuth令牌。
以下是我使用邮递员拨打的电话:
获取
https://login.microsoftonline.com/<TENANT ID>/oauth2/token
标题
Content-Type: application/x-www-form-urlencoded
请求正文
grant_type:client_credentials
client_id: <Azure AD application client ID>
client_secret: <Azure AD application client secret>
scope: https://storage.azure.com/.default
此呼叫后,我将获得成功的响应:
{
"token_type": "Bearer",
"expires_in": "3600",
"ext_expires_in": "3600",
"expires_on": "1574686915",
"not_before": "1574683015",
"resource": "00000002-0000-0000-c000-000000000000",
"access_token": "eyJ0eX<..>" .
}
然后,我尝试使用以下请求创建文件系统:
输入
https://<STORAGE ACCOUNT NAME>.dfs.core.windows.net/<FILESYSTEM NAME>?resource=filesystem
标题
Authorization: Bearer <JWT token>
x-ms-date: Mon, 25 Nov 2019 12:00:00 GMT
x-ms-version: 2019-02-02
并不断出现以下错误:
{
"error": {
"code": "InvalidAuthenticationInfo",
"message": "Server failed to authenticate the request.
Please refer to the information in the www-authenticate header.
\nRequestId:a6bf42d7-a01f-0006-1d88-a304da000000\nTime:2019-11-25T12:05:32.3049492Z"
}
}
我尝试了不同的作用域,但无济于事:
https://dfs.core.windows.net/.default
https://blob.core.windows.net/.default
答案 0 :(得分:1)
我可以重现您的问题,Contributor
RBAC角色就足够了,不需要添加任何API permission
,问题是由您使用{{1}时请求令牌的方式引起的}端点,则需要使用v1.0
。
resource: https://storage.azure.com/
或者您可以将请求URL更改为GET https://login.microsoftonline.com/<TENANT ID>/oauth2/token
grant_type:client_credentials
client_id: <Azure AD application client ID>
client_secret: <Azure AD application client secret>
resource: https://storage.azure.com/
端点,它也将起作用。
v2.0
测试: