我已经使用OWIN库创建了WebApi自托管服务。一切工作都很好,除了身份验证方面的问题。我已经在服务器上启动了服务的两个实例,结果表明从一个服务获得的令牌对于第二个服务有效!据我所知,OWIN使用某些保护密钥对令牌进行了验证。问题是:
设置:
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);
}
}
答案 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
中为实例设置不同的计算机密钥。