如何在dotnet core 3控制台应用程序中获取登录用户的电子邮件



我有一些代码应该在控制台应用程序中运行,并为用户进行一些初始化。代码在dot-netcore3.1中,我需要从环境中获取当前用户的电子邮件来完成任务。我该怎么做?

从Environment中,我看到我可以访问UserName,但这基本上是人员的Name。

Environment.UserName

有什么建议吗?

更新1

假设用户使用他们的Azure Active Directory用户登录Windows/Mac,因此在此处拥有所有必要的电子邮件数据。

更新2

az login是运行应用程序之前的第一个操作。我们能从那个代币里拿走什么吗?

前言:这个答案假设你熟悉OIDC,JWT的结构,并且你知道access_tokenid_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(。

最新更新