Lassen Sie mich Ihnen einen Kontext geben: Ich versuche, benutzerdefinierte Richtlinien in einer ASP.NET -Kern -Web -API zu implementieren, während ich JWT -Träger -Token verwendet. In den geschützten Routen wird dieser Fehler angezeigt: < /p>
05:02:07 Inf] Die Autorisierung ist fehlgeschlagen. Diese Anforderungen wurden nicht erfüllt:
rolesAuthorizationRequirement:User.IsInrol muss für eine der folgenden Rollen der Fall sein Die Anwendung wurde in Frage gestellt. 05:02:07 INF] Anforderung beendet
http/1.1 GET http: // localhost: 5259/api/auth/ - 302 0 null 6.7246ms
05:02 : 07 Inf] Anfrage starten http/1.1 GET
http: // localhost: 5259/Konto/Login? ReturnUrl =%2FAPI%2FAUTH%2F -
application/json null
Ich verstehe, dass dies im Grunde sagt, dass der Benutzer nicht erfolgreich autorisiert werden kann. Arbeiten. Ich dachte sogar, es sei Schlaflosigkeit, die dem Bearer -Token nicht ordnungsgemäß gab, aber ich habe andere Projekte getestet und sie arbeiten in dieser Angelegenheit. Token -basierte Genehmigung. Nach meinem Verständnis des Standard -Tokens für die Genehmigung ist es das Trägertoken innerhalb der Header. Was sendet, wenn Sie es zu Schlaflosigkeit hinzufügen. Die Zeichenfolge selbst. Aber ich habe es noch nicht getestet, da ich immer noch das Register- und Login -Endpunkt herausfinne. < /P>
Ich habe noch festgestellt, warum das nicht funktioniert. Lassen Sie mich Ihnen einen relevanten Code geben, damit Sie mein Setup besser verstehen können.
Dies ist mein relevantes Programm.public static void ConfigureAuthentication(this IServiceCollection services, IConfiguration config)
{
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidIssuer = config["JWT:Issuer"],
ValidateAudience = false,
ValidateLifetime = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["JWT:Key"] ?? throw new Exception("Security Key not found within configuration")))
};
});
}
public static void ConfigureAuthorization(this IServiceCollection services, IConfiguration config)
{
services.AddAuthorization(options =>
{
options.AddPolicy("SudoPolicy", p => p.AddRequirements(
new IsSudoRequirement()
));
options.AddPolicy("SudoRole", p => p.RequireRole("Sudo"));
});
}
public static void ConfigureIdentity(this IServiceCollection services)
{
services.AddIdentity(options =>
{
options.Password.RequiredLength = 6;
}).AddEntityFrameworkStores();
}
< /code>
Dies ist meine benutzerdefinierte Richtlinie. Es sollte nicht verwendet werden, aber ich dachte, ich würde versuchen, eine zu implementieren und nur zu sehen, ob ich es auf diese Weise funktionieren könnte. < /P>
public class IsSudoHandler : AuthorizationHandler
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsSudoRequirement requirement)
{
if (context.User.HasClaim(c => c.Type == "Role" && c.Value.Contains("Sudo")))
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
public class IsSudoRequirement : IAuthorizationRequirement
{
public IsSudoRequirement()
{
IsSudo = true;
}
public bool IsSudo { get; }
}
< /code>
Jetzt ist die Art und Weise, wie ich die Rückgabe des Zugangs -Tokens bearbeite, als solches: < /p>
public async Task CreateAccessTokenAsync(Usuario usuario)
{
var roles = await _userManager.GetRolesAsync(usuario);
var claims = new List()
{
new Claim(JwtRegisteredClaimNames.Sub, usuario.UserName!),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString())
};
claims.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));
var creds = new SigningCredentials(_key, SecurityAlgorithms.HmacSha256);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddMinutes(10),
NotBefore = DateTime.UtcNow.AddSeconds(5),
Issuer = _config["JWT:Issuer"],
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
< /code>
So teste ich diesen spezifischen Token: < /p>
Zugriffs -Token in Schlaflosigkeit < /p>
Und das ist Wie ich versuche, es zu testen: < /p>
[HttpGet]
[Authorize("SudoRole")]
public IActionResult Test()
{
return Ok("Poto");
}
< /code>
und es wirft diesen Fehler aus. Ich habe versucht, verschiedene Richtlinien zu machen. Rollen verwenden. Ansprüche verwenden. Aber ich habe noch gefunden, warum es nicht funktioniert. Vielleicht mache ich etwas falsch, ohne etwas zu tun. Ich habe noch festgestellt, warum es mir einen Fehler gibt. , Ressourcen oder Ratschläge bei der Behebung dieses Problems sowie mit der Architektur und der Art und Weise, wie das Programm strukturiert ist>
Probleme bei der Konfiguration der Autorisierung in ASP.NET Core Web API ⇐ C#
-
- Similar Topics
- Replies
- Views
- Last post