Azure active directory 创建带有用户名PasswordProvider和客户端密码的GraphClient

Azure active directory 创建带有用户名PasswordProvider和客户端密码的GraphClient,azure-active-directory,microsoft-graph-api,Azure Active Directory,Microsoft Graph Api,我创建了一个与Graph API(Beta版)对话的桌面应用程序 在开发版本中,我将其部署在我自己在Azure AD上创建的应用程序上。由于其中一个要求是在使用该应用程序时不显示登录对话框,我决定使用UsernamePasswordProvider,我提供了我帐户的用户名和密码,一切正常(我没有在我的申请中输入客户机密) 当我准备在客户的网络上部署它时,我询问了管理员,他向我提供了服务用户名、密码、租户ID、客户ID和客户机密 我尝试使用邮递员来检查我是否可以从这些信息中获得访问令牌,并且我只能

我创建了一个与Graph API(Beta版)对话的桌面应用程序

在开发版本中,我将其部署在我自己在Azure AD上创建的应用程序上。由于其中一个要求是在使用该应用程序时不显示登录对话框,我决定使用UsernamePasswordProvider,我提供了我帐户的用户名和密码,一切正常(我没有在我的申请中输入客户机密)

当我准备在客户的网络上部署它时,我询问了管理员,他向我提供了服务用户名、密码、租户ID、客户ID和客户机密

我尝试使用邮递员来检查我是否可以从这些信息中获得访问令牌,并且我只能在提供客户端密码以及用户名和密码的情况下才能获得访问令牌

当我回到代码中时,UsernamePasswordProvider的构造函数接受IPublicClient应用程序,而IPublicClient应用程序没有使用客户端机密创建应用程序的选项


我明白这背后有一个原因,因为如果应用程序被反编译,秘密很容易被窃取,但是,如果我(事实上,我的客户)对此不认真,有没有办法通过将用户名、密码和客户端密码放在一起进行身份验证来初始化GraphClient?

重要的是,不建议使用用户名/密码流,因为您的应用程序向用户索要密码是不安全的。有关此问题的详细信息,请参阅我喜欢这个

如果您仍然想使用它,您可以将该用户的用户名和密码放入密钥库,并从代码中获取这些用户名和密码

string keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");
var kvUri = "https://" + keyVaultName + ".vault.azure.net";

var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
var secret = client.GetSecret(secretName); // get username or password here

我建议您使用它,它使服务应用程序能够在没有用户交互的情况下运行。

不幸的是,我无法使用ClientCredentialsProvider,因为我使用的权限是委派的权限。我将使用的用户是专门为此目的创建的,如服务帐户,因此它可能不会伤害任何真实用户。我将尝试使用您的密钥库解决方案,看看我是否可以让它工作。我不确定“说服管理员删除客户机密”是否是这里的一个选项?我是Azure广告新手,所以没有信心提出这个问题。你说“说服管理员删除客户机密”是什么意思?如果你的应用程序是一个公共客户端,则不能包含client_secret或client_断言。如果你的应用程序是一个机密客户端,则必须包含它。我是这方面的noob,因此我可能会误解大部分内容。但从我试图实现的目标来看,创建一个桌面应用程序来调用Graph API,而无需在启动和需要时登录使用委托权限,听起来应该属于公共客户端。但由于我不是进行应用程序注册的人(客户的管理员做了),所以他将其注册为机密权限(从他给我的客户机密猜)。我是否应该与管理员沟通,将注册的应用更改为公共应用,这样就不需要任何客户端机密?我认为您最好使用客户端机密,因为web应用需要客户端机密,而不是本机应用。appsetting.json中有一个设置属性和ROPC流,这可能是您想要的。我认为从给定的ink没有使用客户端密码?我发现它使用公共应用程序,并且只使用用户名和密码进行身份验证。或者你的意思是我不应该在构建桌面应用程序而不是web应用程序时使用客户端密码?