我在IIS中遇到了RSA KeyPairs的奇怪问题。我有一个应用程序,它使用私钥生成签名的JWT令牌。我导出了公钥,我想在另一个消耗这些JWT令牌的应用程序中使用它(用于JWT承载认证)。
从技术上讲,有一个javascript客户端从第一个应用程序WebAPI后端获取JWT令牌,并在对第二个WebAPI后端进行身份验证时使用它。
此代码用于加载公钥和设置身份验证(使用OWIN启动):
// USE from container
string KEY_CONTAINER_NAME = "MyContainer";
int KEY_SIZE = 2048;
CspParameters cspParams = new CspParameters();
cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;
cspParams.KeyContainerName = KEY_CONTAINER_NAME;
var rsa = new RSACryptoServiceProvider(KEY_SIZE, cspParams);
// Api controllers with an [Authorize] attribute will be validated with JWT
appBuilder.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
AllowedAudiences = new[] { "MyAudience" },
TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningToken = new System.IdentityModel.Tokens.RsaSecurityToken(rsa),
ValidAudience = "MyAudience",
ValidIssuer = "MyIssuer"
}
});
我用这个命令将公钥导入存储:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>.\aspnet_regiis.exe -pi MyContainer C:\PublicKey.xml
这不起作用。加载并使用公钥但从不验证传入的令牌。 但是,当我从XML文件加载密钥时,它可以工作!所以我假设导出的XML文件没问题。我不知道为什么会这样?然后我尝试导出导入的公钥并比较这些文件的内容。 它有所不同!
这个命令我用来从商店导出导入的公钥(用于文件内容比较):
C:\Windows\Microsoft.NET\Framework64\v4.0.30319>.\aspnet_regiis.exe -px MyContainer C:\PublicKey_exp.xml
当我从文件而不是从商店加载公钥时,它可以正常工作:
StreamReader sr = new StreamReader("C:\\PublicKey.xml");
String xml = sr.ReadToEnd();
sr.Close();
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xml);