先介绍下项目,项目采用的是System Identity 托管标识的方式部署API,这样的好处是不需要在代码里添加任何关于AAD的信息,
比如ClinetID,用户凭据之类的,更加的安全。
关于托管标识微软是这么介绍的:借助系统分配的托管标识,Azure 资源可以对云服务(例如 Azure Key Vault)进行身份验证,而无需在代码中存储凭据。一旦启用,所有必要权限都可通过 Azure 基于角色的访问控制进行授予。此类托管标识的生命周期与此资源的生命周期绑定在一起。此外,每个资源(例如虚拟机)只能有一个系统分配的托管标识。
系统分配托管标识直接在 Azure 服务实例上启用。 启用标识后,Azure 将在实例的订阅信任的 Azure AD 租户中创建实例的标识。 创建标识后,系统会将凭据预配到实例。 系统分配标识的生命周期直接绑定到启用它的 Azure 服务实例。 如果实例遭删除,Azure 会自动清理 Azure AD 中的凭据和标识,原理见下图:详情参考:https://docs.microsoft.com/zh-cn/azure/active-directory/managed-identities-azure-resources/overview
当开启托管标识以后,系统在AAD的application中自动生成一个application,后面只需要对这个application赋予权限就可以了,赋予权限目前了解到的方式是,通过Azure 的Portal是无法赋予权限的,微软人员说可以通过powershell来赋予权限,参考:https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-azure-ad-graph(但我没有尝试过),我是通过另外一种方式,直接在Azure portal的Role 中,将这个自动生成的application添加进去。
而且这种托管标识的方式支持本地调式,在VS中以用户,登录到 Visual Studio,通过“工具” > “选项” > “Azure 服务身份验证”选择一个用于本地开发的帐户。
而且微软提供了Microsoft.Azure.Services.AppAuthentication库,此支持使用 Microsoft Visual Studio、Azure CLI 或 Azure AD 集成身份验证进行本地开发。 部署到支持托管标识的 Azure 资源时,该库会自动使用 Azure 资源的托管标识。 不需代码或配置更改。 当托管标识不可用时,或者当开发人员的安全上下文不能在本地开发期间确定时,该库还支持直接使用 Azure AD 客户端凭据,简而言之,就是一套代码,自动识别本地还是云端,自动切换
代码非常简单:
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string token = await azureServiceTokenProvider.GetAccessTokenAsync("https://graph.microsoft.com");
如果是本地环境,那这个token就是由某个用户生成的,有scope,当在Azure 上这个token就没有scope,直接使用的是application的权限。
这里写下 下回要讲的Azure的认证,权限,委托权限,最小权限,token ,application直接的关系,以免忘记