Asp.net web api 使用承载令牌时扩展ASP.NET

Asp.net web api 使用承载令牌时扩展ASP.NET,asp.net-web-api,oauth,owin,bearer-token,Asp.net Web Api,Oauth,Owin,Bearer Token,我正在构建一个ASP.NET Web API项目,该项目使用OWIN OAuth承载令牌自定义身份验证。我的API在一台机器上运行得很好,但我真的不明白如何通过负载平衡器将API扩展到多台机器。似乎验证用户/密码并提供承载令牌的机器将是唯一知道如何为未来请求验证该承载令牌的机器。我如何设置,以便负载平衡器后面的任何机器都可以对令牌进行身份验证?我对这种身份验证非常陌生,因此如果我的术语不正确,请原谅。您需要使用相同的audienceId和受众机密创建承载令牌(或jwt令牌);这样,两台机器都可以

我正在构建一个ASP.NET Web API项目,该项目使用OWIN OAuth承载令牌自定义身份验证。我的API在一台机器上运行得很好,但我真的不明白如何通过负载平衡器将API扩展到多台机器。似乎验证用户/密码并提供承载令牌的机器将是唯一知道如何为未来请求验证该承载令牌的机器。我如何设置,以便负载平衡器后面的任何机器都可以对令牌进行身份验证?我对这种身份验证非常陌生,因此如果我的术语不正确,请原谅。

您需要使用相同的audienceId和受众机密创建承载令牌(或jwt令牌);这样,两台机器都可以正确地验证它们

我使用将它们保存在我的web.config文件中,例如:

<add key="as:AudienceId" value="localhost" />
<add key="as:AudienceSecret" value="YVZQUXd6VTZnWkpiR28wV0ROSTZCUzl1RzRRYTRnSDE=" />
<machineKey validationKey="9E7EB24C628533D0F2A0B8CE2E740DD524472EA4A68C21325D007D15ED22E7DF81300BBE2AC70B6259CB41F22FA95AAFECA5BE8D72D8F7A80F13FCECE49DFFC1" decryptionKey="340A7B141479D146A50B59FAF7E4DD7218D6310B8D121178FFE3CE2AC198CD34" validation="SHA1" decryption="AES" />

然后,您可以使用它们生成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();
    }
}
内部类CustomJwtFormat:ISecureDataFormat
{
私有只读字符串_audenceId=SettingsProvider.CurrentAudenceId;
私有只读字符串_issuer=SettingsProvider.CurrentIssuer;
私有只读字符串_symmetricKeyAsBase64=设置Provider.CurrentAudienceCret;
公共字符串保护(AuthenticationTicket数据)
{
如果(数据==null)
{
抛出新的异常(“数据”);
}
var keyByteArray=textcodings.Base64Url.Decode(_symmetricKeyAsBase64);
var signingKey=新的HmacSigningCredentials(keyByteArray);
发布的var=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=新的JwtSecurityTokenHandler();
var jwt=handler.WriteToken(令牌);
返回jwt;
}
公共身份验证票证取消保护(字符串保护文本)
{
抛出新的NotImplementedException();
}
}
其次,您需要在所有web场计算机上使用web.config中的相同计算机密钥,如下所示:

<add key="as:AudienceId" value="localhost" />
<add key="as:AudienceSecret" value="YVZQUXd6VTZnWkpiR28wV0ROSTZCUzl1RzRRYTRnSDE=" />
<machineKey validationKey="9E7EB24C628533D0F2A0B8CE2E740DD524472EA4A68C21325D007D15ED22E7DF81300BBE2AC70B6259CB41F22FA95AAFECA5BE8D72D8F7A80F13FCECE49DFFC1" decryptionKey="340A7B141479D146A50B59FAF7E4DD7218D6310B8D121178FFE3CE2AC198CD34" validation="SHA1" decryption="AES" />