我有一些代码应该在控制台应用程序中运行,并为用户进行一些初始化。代码在dot-netcore3.1中,我需要从环境中获取当前用户的电子邮件来完成任务。我该怎么做?
从Environment中,我看到我可以访问UserName,但这基本上是人员的Name。
Environment.UserName
有什么建议吗?
更新1
假设用户使用他们的Azure Active Directory用户登录Windows/Mac,因此在此处拥有所有必要的电子邮件数据。
更新2
az login
是运行应用程序之前的第一个操作。我们能从那个代币里拿走什么吗?
前言:这个答案假设你熟悉OIDC,JWT的结构,并且你知道access_token
和id_token
的区别和责任。
这个答案基于这篇博客文章:https://mikhail.io/2019/07/how-azure-cli-manages-access-tokens/
当用户运行az login
并且OIDC身份验证流成功时,Azure CLI(az
(将在~/.azure/
将当前凭据状态保存到磁盘。截至2020年3月,az
可执行文件不会试图加密或以其他方式保护其缓存的OIDC令牌不受其他用户进程的影响(无论好坏(——在这种情况下,这是一件好事——前提是你不介意恶意软件轻易获取你的凭据。
用户的电子邮件地址(至少是与AzureAD帐户关联的电子邮件地址(将位于其OIDC身份令牌JWT(id_token
(中-这似乎没有被az login
缓存,因此您需要使用OIDC客户端使用从~/.azure/accessTokens.json
文件中提取的明文access_token
来向AzureAD的OIDC服务请求OIDCuserinfo
(用户配置文件资源((假设access_token
首先允许您访问User Profile Resource(。
但是,假设您确实有权访问用户配置文件资源,则用户的电子邮件地址将位于email
声明属性中。
您无法获取当前操作系统用户的电子邮件,因为它没有定义。
我认为您指的是Windows Active Directory域中的UPN风格用户名,其形式为{userName}@{fqdn}
,例如alice@corp.bob.com
(其中corp.bob.com
是完全限定的Active Directory域名(。由于Microsoft Exchange Server的默认配置,UPN通常是用户的电子邮件地址,但并不总是如此。
但UPN并不存在于不使用Active Directory的平台上,例如嵌入式系统和大多数Linux安装。您必须使用System.EnterpriseServices
中的LDAP库来查找它(可能使用ADSI(。