支持Azure AD中的用户证书身份验证

时间:2016-10-06 20:59:29

标签: azure azure-active-directory

我正在为使用Azure-ActiveDirectory的用户搜索基于公钥/私钥的身份验证,但无法在Azure AD Authentification Scenarios中找到任何提示。每个用户都应该带上自己的密钥对。有任何建议如何实现吗?

2 个答案:

答案 0 :(得分:2)

Azure AD支持OAuth 2.0授权第三方应用程序和OAuth 2.0支持,以使用应用程序的客户端凭据获取令牌。

有两种方法可以获取客户端凭据流的令牌。 首先是使用Azure门户生成的密钥,如下图所示: enter image description here

这是一个关于使用密钥(client_secret)的令牌请求的图: enter image description here

另一种方法是使用证书。技术上讲,证书是一对公钥/私钥。我们将通过应用程序存储公钥信息。当我们要求证明我们是第三方应用程序的所有者时,我们需要使用私钥和Azure AD对邮件进行签名,并使用公钥验证邮件。

要使用应用程序存储证书信息,我们需要更改应用程序的清单。以下是使用here中的自签名证书的详细步骤:

1.生成自签名证书:

makecert -r -pe -n "CN=MyCompanyName MyAppName Cert" -b 03/15/2015 -e 03/15/2017 -ss my -len 2048

2.打开证书MMC管理单元并连接到您的用户帐户。

3.在Personal文件夹中找到新证书,并将公钥导出到base64编码的文件(例如mycompanyname.cer)。您的应用程序将使用此证书与AAD进行通信,因此请确保您也保留对私钥的访问权限。

注意您可以使用Windows PowerShell提取指纹和base64编码的公钥。其他平台提供类似的工具来检索证书的属性。

4.从Windows PowerShell提示符处,键入并运行以下命令:

$cer = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 

$cer.Import("mycer.cer") 
$bin = $cer.GetRawCertData() 
$base64Value = [System.Convert]::ToBase64String($bin) 
$bin = $cer.GetCertHash() 
$base64Thumbprint = [System.Convert]::ToBase64String($bin) 
$keyid = [System.Guid]::NewGuid().ToString()

5.存储$ base64Thumbprint,$ base64Value和$ keyid的值,以便在下一组步骤中更新应用程序清单时使用。 使用从证书中提取的值和生成的密钥ID,您现在必须在Azure AD中更新应用程序清单。

6.在Azure管理门户中,选择您的应用程序,然后在顶部菜单中选择“配置”。

7.在命令栏中,单击“管理清单”,然后选择“下载清单”。

enter image description here

8.打开下载的清单进行编辑,并使用以下JSON替换空的KeyCredentials属性:

"keyCredentials": [
  {
    "customKeyIdentifier": "$base64Thumbprint_from_above",
    "keyId": "$keyid_from_above",
    "type": "AsymmetricX509Cert",
    "usage": "Verify",
    "value": "$base64Value_from_above"
  }
],

9.保存更改并上传更新后的清单,方法是单击命令栏中的“管理清单”,选择“上载清单”,“浏览到更新的清单文件”,然后选择它。

以下是使用证书的令牌请求的数字: enter image description here

在上面的文章中,它从头开始生成client_assertion。我们还可以使用ADAL库来帮助我们并验证守护程序应用程序:

string authority = $"https://login.microsoftonline.com/{tenant}";

var thumbprint="";
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection fcollection = (X509Certificate2Collection)collection.Find(X509FindType.FindByThumbprint, thumbprint, false);
X509Certificate2 cert = fcollection[0];

var certCred = new ClientAssertionCertificate(clientId, cert);
var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(authority);
AuthenticationResult result = null;
try
{
    result = await authContext.AcquireTokenAsync(resource, certCred);
}
catch (Exception ex)
{
}

return result.AccessToken;

如果您想使用证书来授权OAuth2.0代码授权流程,您还可以参考代码示例here

答案 1 :(得分:1)

如果您正在寻找使用证书对Azure AD中的用户(而非应用程序)进行身份验证的编程方法,则目前无法实现此目的。

可以在AD FS(e.g.)中进行基于证书的身份验证,并且可以federate authentication for users from Azure AD to AD FS。但是,这需要Windows Server AD,Azure AD Connect和AD FS的开销,我认为联合身份验证不能以编程方式实现(即不会提示用户选择证书)。