【发布时间】:2015-11-04 01:43:00
【问题描述】:
我在令牌使用者上收到以下错误。任何解决此问题的帮助将不胜感激。谢谢。
“IDX10503:签名验证失败。
尝试的键: 'System.IdentityModel.Tokens.SymmetricSecurityKey'。例外 捕获:'System.InvalidOperationException:IDX10636: SignatureProviderFactory.CreateForVerifying 为键返回 null: 'System.IdentityModel.Tokens.SymmetricSecurityKey', 签名算法: 'http://www.w3.org/2001/04/xmldsig-more#hmac-sha256'。在 Microsoft.IdentityModel.Logging.LogHelper.Throw(字符串消息,类型 exceptionType,EventLevel logLevel,异常 innerException)在 System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(字节[] encodedBytes、Byte[] 签名、SecurityKey 密钥、字符串算法)在 System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateSignature(字符串 令牌,令牌验证参数验证参数)'。令牌: '令牌信息在这里'"
OAuth 服务器上的令牌生成代码
using (var ctlr = new EntityController())
{
var authRepo = ctlr.GetAuthModelRepository();
string clientId;
ticket.Properties.Dictionary.TryGetValue(WebConstants.OwinContextProps.OAuthClientIdPropertyKey, out clientId);
if (string.IsNullOrWhiteSpace(clientId))
{
throw new InvalidOperationException("AuthenticationTicket.Properties does not include audience");
}
//audience record
var client = authRepo.FindAuthClientByOAuthClientID(clientId);
var issued = ticket.Properties.IssuedUtc;
var expires = ticket.Properties.ExpiresUtc;
var hmac = new HMACSHA256(Convert.FromBase64String(client.Secret));
var signingCredentials = new SigningCredentials(
new InMemorySymmetricSecurityKey(hmac.Key),
Algorithms.HmacSha256Signature, Algorithms.Sha256Digest);
TokenValidationParameters validationParams =
new TokenValidationParameters()
{
ValidAudience = clientId,
ValidIssuer = _issuer,
ValidateLifetime = true,
ValidateAudience = true,
ValidateIssuer = true,
RequireSignedTokens = true,
RequireExpirationTime = true,
ValidateIssuerSigningKey = true,
IssuerSigningToken = new BinarySecretSecurityToken(hmac.Key)
};
var jwtHandler = new JwtSecurityTokenHandler();
var jwt = new JwtSecurityToken(_issuer, clientId, ticket.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingCredentials);
jwtOnTheWire = jwtHandler.WriteToken(jwt);
SecurityToken validatedToken = null;
jwtHandler.ValidateToken(jwtOnTheWire, validationParams,out validatedToken);
if (validatedToken == null)
return "token_validation_failed";
}
return jwtOnTheWire;
Owin Startup.cs 中的令牌消耗\验证 ASP.Net 5 vNext 站点
public void ConfigureServices(IServiceCollection services)
services.ConfigureOAuthBearerAuthentication(config =>
{
//oauth validation
var clientSecret = "not the real secret";
var hmac = new HMACSHA256(Convert.FromBase64String(clientSecret));
var signingCredentials = new SigningCredentials(
new SymmetricSecurityKey(hmac.Key), Algorithms.HmacSha256Signature, Algorithms.Sha256Digest);
config.TokenValidationParameters.ValidAudience = "myappname";
config.TokenValidationParameters.ValidIssuer = "mydomain.com";
config.TokenValidationParameters.RequireSignedTokens = true;
config.TokenValidationParameters.RequireExpirationTime = true;
config.TokenValidationParameters.ValidateLifetime = true;
config.TokenValidationParameters.ValidateIssuerSigningKey = true;
config.TokenValidationParameters.ValidateSignature = true;
config.TokenValidationParameters.ValidateAudience = true;
config.TokenValidationParameters.IssuerSigningKey = signingCredentials.SigningKey;
});
public void Configure(IApplicationBuilder 应用程序)
app.UseOAuthBearerAuthentication(config =>
{
config.AuthenticationScheme = "Bearer";
config.AutomaticAuthentication = true;
});
【问题讨论】:
标签: c# asp.net security oauth jwt