Azure AD OAuth2.0访问令牌能否携带自定义数据识别调用API的注册应用?
识别守护程序流中发起请求的站点
这个问题其实有几个实用的解决方案,我结合你的场景给你梳理下:
利用默认的
appid声明直接映射
每个独立注册的Azure AD客户端应用,在请求到的访问令牌里都会默认包含appid声明(值就是该应用的ClientId)。你完全可以在你的Web API里维护一个ClientId与站点名称的映射表(比如配置文件或者数据库存储),当请求过来时,解析令牌中的appid,再通过映射表找到对应的站点。这种方式零额外配置,是最直接的方案。通过应用角色(App Roles)实现标识与权限控制
你可以在Web API的Azure AD应用注册中,为每个站点创建专属的应用角色(比如SiteA_Access、SiteB_Access),然后把这些角色分别分配给对应的客户端应用。这样客户端获取的访问令牌里会包含roles声明,你既可以通过这个声明识别站点,还能顺便实现基于站点的权限校验,一举两得。添加自定义声明(可选,适合特殊场景)
你之前的理解有点小偏差——OAuth2访问令牌其实是可以添加自定义声明的,只是不像ID令牌那样在门户里直接操作那么直观:- 方式一:在客户端应用的Azure AD注册页面,进入「令牌配置」,添加可选声明,比如可以把应用的
displayname(也就是你给每个客户端命名的站点名称)添加到访问令牌中; - 方式二:通过Graph API给客户端应用添加自定义属性,再配置令牌将该属性作为声明返回。不过这种方式相对复杂,除非你需要传递特殊的自定义信息,否则前两种方案更高效。
- 方式一:在客户端应用的Azure AD注册页面,进入「令牌配置」,添加可选声明,比如可以把应用的
在Asp.Net Core 2.0的API中,你可以这样获取这些声明:
// 获取ClientId(appid声明) var clientId = User.Claims.FirstOrDefault(c => c.Type == "appid")?.Value; // 获取角色声明 var siteRoles = User.Claims.Where(c => c.Type == "roles").Select(c => c.Value);
内容的提问来源于stack exchange,提问作者EiEiGuy
相关产品推荐
相关产品推荐

