2016-04-07 57 views
1

我正在构建一个使用OWIN OAuth承载令牌自定义认证的ASP.NET Web API项目。我的API在单台机器上运行良好,但并不真正了解如何通过负载平衡器将API扩展到多台机器。似乎认证用户/密码并提供不记名令牌的计算机将是唯一一个能够知道如何为将来的请求认证该不记名令牌的计算机。我该如何设置,以便负载平衡器后面的任何机器都可以对令牌进行身份验证?我对这种认证很新,所以如果我的术语不正确,请原谅我。使用承载令牌时扩展ASP.NET

回答

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" />