WebApi OWIN相同令牌对两个不同的服务实例有效

时间:2018-07-23 16:04:07

标签: c# oauth oauth-2.0 asp.net-web-api2 owin

我已经使用OWIN库创建了WebApi自托管服务。一切工作都很好,除了身份验证方面的问题。我已经在服务器上启动了服务的两个实例,结果表明从一个服务获得的令牌对于第二个服务有效!据我所知,OWIN使用某些保护密钥对令牌进行了验证。问题是:

  1. 如何使密钥对于其他服务实例无效?我尝试使用Generate-MachineKey生成自定义密钥,但结果是相同的。
  2. OWIN使用什么保护密钥?它存储在某个地方吗?
  3. 此密钥对于不同的应用程序是否有所不同?

设置:

var oAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/token"),
    AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(accessTokenExipreMinutes),
    Provider = new AuthorizationServerProvider(),
    AllowInsecureHttp = allowInsecureHttp
};

appBuilder.UseOAuthBearerTokens(oAuthOptions);  

授权服务器提供者:

class AuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.TryGetFormCredentials(out string clientId, out string clientSecret);

        var result = Validate(clientId, clientSecret);
        if (result)
        {
            context.Validated(clientId);
            return;
        }

        context.Rejected();
    }

    public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        try
        {
            ClaimsIdentity oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
            var props = new AuthenticationProperties();
            var ticket = new AuthenticationTicket(oAuthIdentity, props);

            context.Validated(ticket);
        }
        catch (Exception ex)
        {
            context.Rejected();
        }

        return Task.FromResult(true);
    }
}

1 个答案:

答案 0 :(得分:1)

OAuthAuthorizationServerOptions中有一个名为AccessTokenFormat的属性,它将AuthenticationTicket转换为byte[],反之亦然。此选项加密令牌。您可以为不同的应用程序实例使用不同的键设置此选项,以使它们无法读取彼此的令牌。

这是您设置AccessTokenFormat

的方式
IDataProtector dataProtecter = app.CreateDataProtector("YOUR_KEY");
var ticketDataFormat = new TicketDataFormat(dataProtecter);
new OAuthAuthorizationServerOptions
{
    TicketDataFormat = ticketDataFormat
};

Owin的默认设置是它使用您的计算机密钥来创建TicketDataFormat,因此您还可以在web.config中为实例设置不同的计算机密钥。