Azure AD AcquireToken 不适用于应用程序密码
Azure AD AcquireToken does not work with app password
我正在尝试使用 .NET ADAL 库验证 Azure AD 中的用户密码。
这对于没有 MFA 的普通用户帐户来说工作正常,但我 运行 对激活了 MFA 的用户执行此操作时遇到问题。
当使用用户的实际密码时,我得到了AADSTS50076: Application password is required.
,这很正常,但是当我创建一个新的应用程序密码时,我收到了错误AADSTS70002: Error validating credentials. AADSTS50020: Invalid username or password
。我创建了多个应用程序密码,但它们都不起作用。
用于尝试验证的代码如下:
var ac = new AuthenticationContext("https://login.windows.net/my-tenant.com");
var authResult = ac.AcquireToken("https://graph.windows.net", "my-client-id", new UserCredential("my.account@my-tenant.com", "my-password"));
尝试进行身份验证的用户是此 AD 中的全局管理员。
是否可以为具有 MFA 的用户进行这样的身份验证?
因此,为了稍微回答我自己的问题,我采取了以下措施(为简洁起见进行了清理):
public class AzureAdAuthenticationProvider
{
private const string AppPasswordRequiredErrorCode = "50076";
private const string AuthorityFormatString = "https://login.windows.net/{0}";
private const string GraphResource = "https://graph.windows.net";
private AuthenticationContext _authContext;
private string _clientId;
public AzureAdAuthenticationProvider()
{
var tenantId = "..."; // Get from configuration
_authContext = new AuthenticationContext(string.Format(AuthorityFormatString, tenantId));
}
public bool Authenticate(string user, string pass)
{
try
{
_authContext.AcquireToken(GraphResource, _clientId, new UserCredential(user, pass));
return true;
}
catch (AdalServiceException ase)
{
return ase.ServiceErrorCodes.All(sec => sec == AppPasswordRequiredErrorCode);
}
catch (Exception)
{
return false; // Probably needs proper handling
}
}
}
它不漂亮,但它完成了工作。
通过使用ServiceErrorCodes.All()
,我确保仅当发生单个 AppPasswordRequired 错误时,身份验证才成功。
此方法的唯一缺点是启用了 MFA 的用户必须使用他们的实际帐户密码才能登录。似乎不支持使用应用密码。
我正在尝试使用 .NET ADAL 库验证 Azure AD 中的用户密码。 这对于没有 MFA 的普通用户帐户来说工作正常,但我 运行 对激活了 MFA 的用户执行此操作时遇到问题。
当使用用户的实际密码时,我得到了AADSTS50076: Application password is required.
,这很正常,但是当我创建一个新的应用程序密码时,我收到了错误AADSTS70002: Error validating credentials. AADSTS50020: Invalid username or password
。我创建了多个应用程序密码,但它们都不起作用。
用于尝试验证的代码如下:
var ac = new AuthenticationContext("https://login.windows.net/my-tenant.com");
var authResult = ac.AcquireToken("https://graph.windows.net", "my-client-id", new UserCredential("my.account@my-tenant.com", "my-password"));
尝试进行身份验证的用户是此 AD 中的全局管理员。
是否可以为具有 MFA 的用户进行这样的身份验证?
因此,为了稍微回答我自己的问题,我采取了以下措施(为简洁起见进行了清理):
public class AzureAdAuthenticationProvider
{
private const string AppPasswordRequiredErrorCode = "50076";
private const string AuthorityFormatString = "https://login.windows.net/{0}";
private const string GraphResource = "https://graph.windows.net";
private AuthenticationContext _authContext;
private string _clientId;
public AzureAdAuthenticationProvider()
{
var tenantId = "..."; // Get from configuration
_authContext = new AuthenticationContext(string.Format(AuthorityFormatString, tenantId));
}
public bool Authenticate(string user, string pass)
{
try
{
_authContext.AcquireToken(GraphResource, _clientId, new UserCredential(user, pass));
return true;
}
catch (AdalServiceException ase)
{
return ase.ServiceErrorCodes.All(sec => sec == AppPasswordRequiredErrorCode);
}
catch (Exception)
{
return false; // Probably needs proper handling
}
}
}
它不漂亮,但它完成了工作。
通过使用ServiceErrorCodes.All()
,我确保仅当发生单个 AppPasswordRequired 错误时,身份验证才成功。
此方法的唯一缺点是启用了 MFA 的用户必须使用他们的实际帐户密码才能登录。似乎不支持使用应用密码。