我正在构建一个使用OWIN OAuth承载令牌自定义身份验证的ASP.NET Web API项目。我的API适用于单台机器,但我并不了解如何通过负载均衡器将API扩展到多台机器。似乎验证用户/密码并提供承载令牌的机器将是唯一知道如何为将来的请求验证该承载令牌的机器。如何进行设置以使负载均衡器后面的任何计算机都可以对令牌进行身份验证?我对这种身份验证很陌生,所以如果我的术语不正确,请原谅我。
答案 0 :(得分:1)
您需要使用相同的audienceId和受众机密创建承载令牌(或jwt令牌);这样两台机器都可以正确验证它们。
我用它来保存在我的web.config文件中,例如:
<add key="as:AudienceId" value="localhost" />
<add key="as:AudienceSecret" value="YVZQUXd6VTZnWkpiR28wV0ROSTZCUzl1RzRRYTRnSDE=" />
然后你可以用它们来生成你的jwt标记:
internal class CustomJwtFormat : ISecureDataFormat<AuthenticationTicket>
{
private readonly string _audienceId = SettingsProvider.CurrentAudienceId;
private readonly string _issuer = SettingsProvider.CurrentIssuer;
private readonly string _symmetricKeyAsBase64 = SettingsProvider.CurrentAudienceSecret;
public String Protect(AuthenticationTicket data)
{
if (data == null)
{
throw new ArgumentNullException("data");
}
var keyByteArray = TextEncodings.Base64Url.Decode(_symmetricKeyAsBase64);
var signingKey = new HmacSigningCredentials(keyByteArray);
var issued = data.Properties.IssuedUtc;
var expires = data.Properties.ExpiresUtc;
var token = new JwtSecurityToken(_issuer, _audienceId, data.Identity.Claims, issued.Value.UtcDateTime,
expires.Value.UtcDateTime, signingKey);
var handler = new JwtSecurityTokenHandler();
var jwt = handler.WriteToken(token);
return jwt;
}
public AuthenticationTicket Unprotect(String protectedText)
{
throw new NotImplementedException();
}
}
其次,您需要在所有Web场机器上的web.config中使用相同的机器密钥,如下所示:
<machineKey validationKey="9E7EB24C628533D0F2A0B8CE2E740DD524472EA4A68C21325D007D15ED22E7DF81300BBE2AC70B6259CB41F22FA95AAFECA5BE8D72D8F7A80F13FCECE49DFFC1" decryptionKey="340A7B141479D146A50B59FAF7E4DD7218D6310B8D121178FFE3CE2AC198CD34" validation="SHA1" decryption="AES" />