Das ASP.NET Core 8-Web-API-JWT-Token wird nicht authentifiziert
Posted: 11 Jan 2025, 08:04
Ich habe den folgenden API-Endpunkt, den ich mit dem Dekorator [Authorize] schützen möchte:
Wenn dieser Endpunkt aufgerufen wird, wird ein Fehler „401 Unauthorized“ zurückgegeben, bevor der Code in die Methode eintritt.
Meine appsettings.json-Datei lauten wie folgt:
Ich habe auch eine Konfigurationseinstellungsklasse für JwtTokenSettings, die den gleichen Namen trägt, JwtTokenSettings (nicht gezeigt).
Ein JWT-Token wird durch den Aufruf von GenerateToken von einem JwtTokenService erstellt. Ich habe Folgendes geschrieben:
Abschließend werden Microsoft JwtService, JwtTokenService und JwtTokenSettings wie folgt in Program.cs installiert:
Wenn ich den Dekorator [Authorize] vom Controller entferne, kann der Benutzer erfolgreich auf den API-Endpunkt zugreifen. Darüber hinaus kann der Benutzer mithilfe des folgenden Codes in der Get-Methode (Endpunkt) des Controllers korrekt identifiziert werden.
Auch wenn JWTService „weiß“, wer der Benutzer ist, wird es ihn nicht authentifizieren.
Ich hoffe, dass alle relevanten Teile vorliegen sind hier. Kann jemand helfen, das Problem zu erkennen? Ich weiß die Hilfe WIRKLICH zu schätzen!
Code: Select all
[Authorize]
[Route("[controller]")]
public class FastaController : Controller
{
[HttpGet()]
public async Task Get(int page = 1, string search = "", int pageSize = 25)
{
// retrieve data here
}
}
Meine appsettings.json-Datei lauten wie folgt:
Code: Select all
"JwtTokenSettings": {
"Key": "fc746b61cde4f6665d3f9791446cd5395661860c0075a905ed9810b7391af467",
"Issuer": "Comply",
"Audience": "comply",
"ExpiryHours": 24
}
Ein JWT-Token wird durch den Aufruf von GenerateToken von einem JwtTokenService erstellt. Ich habe Folgendes geschrieben:
Code: Select all
public class JwtTokenService : IJwtTokenService
{
private readonly IOptions jwtTokenSettings;
public JwtTokenService(IOptions jwtTokenSettings)
{
this.jwtTokenSettings = jwtTokenSettings;
}
public string GenerateToken(Guid userId, string userEmail)
{
string secretKey = jwtTokenSettings.Value.Key;
string issuer = jwtTokenSettings.Value.Issuer;
string audience = jwtTokenSettings.Value.Audience;
var expiryHours = jwtTokenSettings.Value.ExpiryHours;
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, userId.ToString()),
new Claim(JwtRegisteredClaimNames.Email, userEmail),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var token = new JwtSecurityToken(
issuer: issuer,
audience: audience,
claims: claims,
expires: DateTime.UtcNow.AddHours(expiryHours),
signingCredentials: credentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
Code: Select all
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure(
configuration.GetSection("JwtTokenSettings")
);
var jwtSettings = builder.Configuration.GetSection("JwtTokenSettings");
var key = Encoding.UTF8.GetBytes(jwtSettings["Key"]);
builder.Services.AddSingleton();
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings["Issuer"],
ValidAudience = jwtSettings["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(key)
};
});
Code: Select all
var services = this.HttpContext.RequestServices;
var httpContextAccessor = (IHttpContextAccessor)services.GetService(typeof(IHttpContextAccessor));
var userId = httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
Ich hoffe, dass alle relevanten Teile vorliegen sind hier. Kann jemand helfen, das Problem zu erkennen? Ich weiß die Hilfe WIRKLICH zu schätzen!