【发布时间】:2018-02-01 14:06:52
【问题描述】:
我正在尝试使用 ClaimsPrincipal 登录,然后在 .net core 2.0 中获取 JWT。使用我当前的代码,我从 SignInAsync 函数的结果中得到错误:
"没有配置 IAuthenticationSignInHandler 来处理方案的登录:Bearer"
这是我目前使用的控制器:
[Route("Login/{username}")]
public async Task<IActionResult> Login(string username)
{
var userClaims = new List<Claim>
{
new Claim(ClaimTypes.Name, username)
};
var principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims));
var sign = HttpContext.SignInAsync(principal);
await sign;
var res = await HttpContext.AuthenticateAsync();
var token = await HttpContext.GetTokenAsync("access_token");
return Json(token);
}
登录部分已经过测试,可以很好地与 cookie 配合使用。但是,当我在 startup.cs 中使用以下代码和 JwtBearerDefaults.AuthenticationScheme 时:
services.AddAuthentication(config => {
config.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
config.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(config =>
{
config.TokenValidationParameters = Token.tokenValidationParameters;
config.RequireHttpsMetadata = false;
config.SaveToken = true;
});
我从SignInAsync 函数的结果中得到错误:
"没有配置 IAuthenticationSignInHandler 来处理方案的登录:Bearer"
我的 Token 类是在我在网上(JWT on .NET Core 2.0)找到的代码的帮助下创建的,定义如下:
public static class Token
{
public static TokenValidationParameters tokenValidationParameters {
get
{
return new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = GetSignInKey(),
ValidateIssuer = true,
ValidIssuer = GetIssuer(),
ValidateAudience = true,
ValidAudience = GetAudience(),
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero
};
}
}
static private SymmetricSecurityKey GetSignInKey()
{
const string secretKey = "very_long_very_secret_secret";
var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
return signingKey;
}
static private string GetIssuer()
{
return "issuer";
}
static private string GetAudience()
{
return "audience";
}
}
【问题讨论】:
标签: jwt claims-based-identity claims .net-core-2.0