WebAPI使用用户名&amp ;;对Azure AD进行非交互式身份验证密码

时间:2017-08-09 13:11:19

标签: c# azure authentication asp.net-web-api

我在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获取访问令牌和刷新令牌。

1 个答案:

答案 0 :(得分:0)

您似乎在azure广告中注册了一个使用用户名和密码进行身份验证的网络应用/ API。我们只能使用本机客户端的资源所有者流。机密客户端(如网站)无法使用直接用户凭据。

您需要将其作为公共客户端(本机客户端应用程序)调用,而不是作为机密客户端(Web应用程序/ API)。有关如何使用ADAL .NET通过用户名/密码对用户进行身份验证的更多信息,请参阅this document。特别是Constraints & Limitations部分。

您也可以在方案中使用client credential flow,但是通过此流程,应用程序会将其客户端凭据提供给OAuth2令牌发布端点,并作为回报获取一个代表应用程序本身的访问令牌,而无需任何用户信息。应用程序无需获取刷新令牌。当访问令牌到期时,它只会返回到OAuth2令牌发出端点以获取新的令牌。