我应该在哪里创建 Active Directory 应用程序角色,以便我可以在访问令牌中看到这些角色?
where should I create Active Directory app roles so that I can see those roles in the access token?
我已经注册了一个 angular 应用程序 和一个 Asp.Net 核心网站 API到 Azure 活动目录。我在 Angular 的注册中添加了一个 app role。我还将角色分配给了一个用户。
当我登录用户时,我在访问令牌中看不到角色 属性。我只看到这个"scp": "Directory.Read.All openid profile User.Read email",
.
角色 属性 出现在 id 令牌中。像这样:
"roles": [
"can_read_own_application"
],
既然 access_token 就是 API 正在怀孕。
顺便说一句,关于这个主题的文档数不胜数。我刚看了 MS 员工制作的 video。我找不到它说应用程序角色应该添加到客户端应用程序还是 API 应用程序的地方。也许这就是角色没有出现在访问令牌中的原因。但是,添加到 API 注册的应用程序角色甚至没有出现在令牌中。
感谢您的帮助。
编辑
我在API中添加了一个作用域
我用客户端“ID”更新了 API 清单
"knownClientApplications": ["351d2a1d-fb5f-4527-b614-edb6d7277043" ]
- 我为客户端API更新了权限
- 我更新了我的 angular 代码
现在登录时,找不到上面的scope。访问令牌具有此值:
{
"app_displayname": "MyApplication-Client-Local",
//..
"scp": "openid profile User.Read email",
}
我什至不记得要过 openid
和 email
。我提到的范围是 User.Read
和 access_as_user
.
我想我可以在这里回答你的部分问题。
对于访问令牌,它是在 Azure 广告应用程序的帮助下生成的。可以在azure portal -> azure ad中注册一个azure ad,也可以给这个app设置api权限
这里假设一个场景,你需要调用一个可以return你租户中用户信息的api,然后你需要调用微软提供的get user graph api
(这个 api 与你自己的 api 相似)。而调用这个api需要在http请求headers中有一个access token并且这个token应该包含读取用户信息的权限。就像 api 文档中描述的那样,当调用 api 时,用于生成访问令牌的应用程序应该首先具有 User.Read permission type : delegate
或 User.Read.All permission type : application
等。那么在添加了api权限之后,来自这个应用的access token会包含scp:User.Read
或者roles:User.Read.All
.
application & delegate类型的区别,可以简单的知道是生成access token的方式。有 2 个典型的流程来生成访问令牌,auth code flow and client credential flow。一个要求用户登录(delegate,表示代表用户,will return scp claim)而另一个只使用 azure ad application 的 client-id 和 client-secret(application,表示代表应用程序,always在守护程序应用程序或 api 应用程序中使用,将 return 角色声明)。
现在你的访问令牌包含正确的权限,用户api将解码令牌可以发现它有scp:User.Read
或roles:User.Read.All
,然后apireturns 对 http 请求的响应。你自己的api也是一样的。您的 api 应该首先解码访问令牌以检查传入请求是否具有访问 api 本身的正确权限,例如它需要 User.Richard.Read
权限,但您找不到这种azure ad中的api权限因为这个api权限是你自己定义的,所以你需要再注册一个azure ad应用来发挥api的作用,并且在这个应用中,你应该expose an api with the custom api permission。然后返回生成访问令牌的应用程序,然后为其分配 api 权限。然后您可以通过此应用程序生成范围为 User.Richard.Read
.
的访问令牌
关注后this tutorial step by step。我意识到 requesting/obtaining 来自 Azure AD 的令牌不是一次性操作。
我注册了 2 个应用程序:客户端应用程序 (angular) 和 API (asp.net核心网站 api).
当用户登录时,令牌he/she 获取来自客户端注册。这是有道理的,因为在登录过程中提供的信息是客户端应用程序的信息。
难怪现在访问令牌不包含我在 API 注册的权限。顺便说一句,令牌中 属性 audience 的值是 Graph 本身的值 00000003-0000-0000-c000-000000000000
。所以这个token是为了查询用户身份等等。
只有当我调用 API 时,Angular 才会向 Azure 发出另一个 POST 请求 API 可用的令牌的 AD,使用刷新令牌和 url 到我在这里提到的范围
export const protectedResources = {
todoListApi:{
端点:“https://localhost:44351/api/todolist”,
范围:[[api://8755d178-93a7-4a30-95ea-b59177e85d7f/access_as_user"],
},
}
protectedResourceMap.set(protectedResources.todoListApi.endpoint,
protectedResources.todoListApi.scopes);
当这个令牌到达时,它包含值 "aud": "the_api_guid"
和 "scp": "access_as_user"
。
我已经注册了一个 angular 应用程序 和一个 Asp.Net 核心网站 API到 Azure 活动目录。我在 Angular 的注册中添加了一个 app role。我还将角色分配给了一个用户。
当我登录用户时,我在访问令牌中看不到角色 属性。我只看到这个"scp": "Directory.Read.All openid profile User.Read email",
.
角色 属性 出现在 id 令牌中。像这样:
"roles": [
"can_read_own_application"
],
既然 access_token 就是 API 正在怀孕。
顺便说一句,关于这个主题的文档数不胜数。我刚看了 MS 员工制作的 video。我找不到它说应用程序角色应该添加到客户端应用程序还是 API 应用程序的地方。也许这就是角色没有出现在访问令牌中的原因。但是,添加到 API 注册的应用程序角色甚至没有出现在令牌中。
感谢您的帮助。
编辑
我在API中添加了一个作用域
我用客户端“ID”更新了 API 清单
"knownClientApplications": ["351d2a1d-fb5f-4527-b614-edb6d7277043" ]
- 我为客户端API更新了权限
- 我更新了我的 angular 代码
现在登录时,找不到上面的scope。访问令牌具有此值:
{
"app_displayname": "MyApplication-Client-Local",
//..
"scp": "openid profile User.Read email",
}
我什至不记得要过 openid
和 email
。我提到的范围是 User.Read
和 access_as_user
.
我想我可以在这里回答你的部分问题。
对于访问令牌,它是在 Azure 广告应用程序的帮助下生成的。可以在azure portal -> azure ad中注册一个azure ad,也可以给这个app设置api权限
这里假设一个场景,你需要调用一个可以return你租户中用户信息的api,然后你需要调用微软提供的get user graph api
(这个 api 与你自己的 api 相似)。而调用这个api需要在http请求headers中有一个access token并且这个token应该包含读取用户信息的权限。就像 api 文档中描述的那样,当调用 api 时,用于生成访问令牌的应用程序应该首先具有 User.Read permission type : delegate
或 User.Read.All permission type : application
等。那么在添加了api权限之后,来自这个应用的access token会包含scp:User.Read
或者roles:User.Read.All
.
application & delegate类型的区别,可以简单的知道是生成access token的方式。有 2 个典型的流程来生成访问令牌,auth code flow and client credential flow。一个要求用户登录(delegate,表示代表用户,will return scp claim)而另一个只使用 azure ad application 的 client-id 和 client-secret(application,表示代表应用程序,always在守护程序应用程序或 api 应用程序中使用,将 return 角色声明)。
现在你的访问令牌包含正确的权限,用户api将解码令牌可以发现它有scp:User.Read
或roles:User.Read.All
,然后apireturns 对 http 请求的响应。你自己的api也是一样的。您的 api 应该首先解码访问令牌以检查传入请求是否具有访问 api 本身的正确权限,例如它需要 User.Richard.Read
权限,但您找不到这种azure ad中的api权限因为这个api权限是你自己定义的,所以你需要再注册一个azure ad应用来发挥api的作用,并且在这个应用中,你应该expose an api with the custom api permission。然后返回生成访问令牌的应用程序,然后为其分配 api 权限。然后您可以通过此应用程序生成范围为 User.Richard.Read
.
关注后this tutorial step by step。我意识到 requesting/obtaining 来自 Azure AD 的令牌不是一次性操作。
我注册了 2 个应用程序:客户端应用程序 (angular) 和 API (asp.net核心网站 api).
当用户登录时,令牌he/she 获取来自客户端注册。这是有道理的,因为在登录过程中提供的信息是客户端应用程序的信息。
难怪现在访问令牌不包含我在 API 注册的权限。顺便说一句,令牌中 属性 audience 的值是 Graph 本身的值 00000003-0000-0000-c000-000000000000
。所以这个token是为了查询用户身份等等。
只有当我调用 API 时,Angular 才会向 Azure 发出另一个 POST 请求 API 可用的令牌的 AD,使用刷新令牌和 url 到我在这里提到的范围
export const protectedResources = { todoListApi:{ 端点:“https://localhost:44351/api/todolist”, 范围:[[api://8755d178-93a7-4a30-95ea-b59177e85d7f/access_as_user"], }, }
protectedResourceMap.set(protectedResources.todoListApi.endpoint, protectedResources.todoListApi.scopes);
当这个令牌到达时,它包含值 "aud": "the_api_guid"
和 "scp": "access_as_user"
。