我应该在哪里创建 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 注册的应用程序角色甚至没有出现在令牌中。

感谢您的帮助。

编辑

  1. 我在API中添加了一个作用域

  2. 我用客户端“ID”更新了 API 清单

"knownClientApplications": ["351d2a1d-fb5f-4527-b614-edb6d7277043" ]

  1. 我为客户端API更新了权限

  1. 我更新了我的 angular 代码

现在登录时,找不到上面的scope。访问令牌具有此值:

{
   "app_displayname": "MyApplication-Client-Local",
    //..
    "scp": "openid profile User.Read email",
}

我什至不记得要过 openidemail。我提到的范围是 User.Readaccess_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 : delegateUser.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.Readroles: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 的令牌不是一次性操作。

  1. 我注册了 2 个应用程序:客户端应用程序 (angular) 和 API (asp.net核心网站 api).

  2. 当用户登录时,令牌he/she 获取来自客户端注册。这是有道理的,因为在登录过程中提供的信息是客户端应用程序的信息。

难怪现在访问令牌不包含我在 API 注册的权限。顺便说一句,令牌中 属性 audience 的值是 Graph 本身的值 00000003-0000-0000-c000-000000000000。所以这个token是为了查询用户身份等等。

  1. 只有当我调用 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"