我在Azure上托管了Rest服务,并启用了Azure AD身份验证。我在Microsoft Add in中使用此Web服务。
我不想向用户提示Microsoft登录页面。而是使用他的用户名和密码登录后台并获取访问令牌和刷新令牌。
我一直在使用以下代码:
private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
AuthenticationResult result = null;
string user = "";
string password = "";
string resrouce = "web service URL";
authContext = new AuthenticationContext(authority, new FileCache());
UserCredential uc = new UserPasswordCredential(user, password);
result = authContext.AcquireTokenAsync(todoListResourceId, clientId, uc).Result;
此代码的例外是“请求正文必须包含以下参数:client_secret或client_assertion”。我没有找到通过用户凭据传递客户端密钥或客户端断言的方法。
我也试过下面的代码。在下面的代码中使用客户端ID和客户端密钥并获取将在一小时后到期的访问令牌,此代码不返回刷新令牌。此访问令牌不是特定于用户的。
string tenantName = "contoso.com";
string authString = "https://login.microsoftonline.com/" + tenantName;
AuthenticationContext authenticationContext = new AuthenticationContext(authString, false);
string clientId = "a3b4eef4-33f0-4e98-9d57-ad14549bf310";
string key = "Secret Key";
ClientCredential clientCred = new ClientCredential(clientId, key);
string resource = "Service URL ";
string token;
AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync(resource, clientCred).Result;
token = authenticationResult.AccessToken;
有没有办法在不提示用户Microsoft登录表单的情况下从Azure AD获取访问令牌和刷新令牌。
答案 0 :(得分:0)
您似乎在azure广告中注册了一个使用用户名和密码进行身份验证的网络应用/ API。我们只能使用本机客户端的资源所有者流。机密客户端(如网站)无法使用直接用户凭据。
您需要将其作为公共客户端(本机客户端应用程序)调用,而不是作为机密客户端(Web应用程序/ API)。有关如何使用ADAL .NET通过用户名/密码对用户进行身份验证的更多信息,请参阅this document。特别是Constraints & Limitations
部分。
您也可以在方案中使用client credential flow,但是通过此流程,应用程序会将其客户端凭据提供给OAuth2令牌发布端点,并作为回报获取一个代表应用程序本身的访问令牌,而无需任何用户信息。应用程序无需获取刷新令牌。当访问令牌到期时,它只会返回到OAuth2令牌发出端点以获取新的令牌。