Skip to content

Commit aa08701

Browse files
add list of categories in token instead of roles and functions only
1 parent fdeac93 commit aa08701

File tree

4 files changed

+27
-32
lines changed

4 files changed

+27
-32
lines changed

UserManagementApi/Controllers/UsersController.cs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,10 @@ public async Task<ActionResult<AuthResponse>> Authenticate([FromBody] DTO.LoginR
4444
return Unauthorized("Invalid credentials.");
4545
}
4646

47-
// Collect roles & function codes for claims (optional but handy)
48-
var roleIds = user.UserRoles.Select(ur => ur.RoleId).ToList();
49-
50-
var functionCodes = await _db.RoleFunctions
51-
.Where(rf => roleIds.Contains(rf.RoleId))
52-
.Select(rf => rf.Function.Code)
53-
.Distinct()
54-
.ToListAsync();
55-
56-
var token = GenerateJwt(user, user.UserRoles.Select(ur => ur.Role.Name).Distinct().ToList(), functionCodes, out var expiresAtUtc);
47+
48+
var dto = await BuildPermissionsForUser(user.Id);
49+
50+
var token = GenerateJwt(user, dto.Categories, out var expiresAtUtc);
5751

5852
// Get the same permissions tree you already expose
5953
var permissions = await BuildPermissionsForUser(user.Id);
@@ -136,24 +130,26 @@ on rf.FunctionId equals f.Id
136130

137131
return new UserPermissionsDto(user.Id, user.UserName, categoryDtos);
138132
}
139-
140-
private string GenerateJwt(AppUser user, IEnumerable<string> roles, IEnumerable<string> functionCodes, out DateTime expiresAtUtc)
133+
134+
private string GenerateJwt(AppUser user, List<CategoryDto> Categories, out DateTime expiresAtUtc)
141135
{
142-
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwt.KeyBase64));
136+
var keyBase64 = _jwt.Key;
137+
var keyPlain = Encoding.UTF8.GetString(Convert.FromBase64String(keyBase64));
138+
139+
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(keyPlain));
143140
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
144141

145142
var claims = new List<Claim>
146143
{
147144
new(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
148145
new(JwtRegisteredClaimNames.UniqueName, user.UserName)
149146
};
150-
151-
// optional: add role claims
152-
claims.AddRange(roles.Select(r => new Claim(ClaimTypes.Role, r)));
153-
154-
// optional: add function claims (careful: keep token size reasonable)
155-
foreach (var fn in functionCodes)
156-
claims.Add(new Claim("perm", fn));
147+
148+
149+
// optional: add claims (careful: keep token size reasonable)
150+
var categoriesJson = System.Text.Json.JsonSerializer.Serialize(Categories);
151+
claims.Add(new Claim("categories", categoriesJson));
152+
157153

158154
var now = DateTime.UtcNow;
159155
expiresAtUtc = now.AddMinutes(_jwt.ExpiresMinutes);

UserManagementApi/DTO/Auth/JwtOptions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public class JwtOptions
44
{
55
public string Issuer { get; set; } = null!;
66
public string Audience { get; set; } = null!;
7-
public string KeyBase64 { get; set; } = null!;
7+
public string Key { get; set; } = null!;
88
public int ExpiresMinutes { get; set; }
99
}
1010
}

UserManagementApi/Program.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
builder.Services.Configure<JwtOptions>(builder.Configuration.GetSection("Jwt"));
3131
var jwt = builder.Configuration.GetSection("Jwt").Get<JwtOptions>()!;
3232

33-
var keyBase64 = builder.Configuration["Jwt:KeyBase64"]!;
33+
var keyBase64 = builder.Configuration["Jwt:Key"]!;
3434
var keyPlain = Encoding.UTF8.GetString(Convert.FromBase64String(keyBase64));
3535

3636
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
@@ -58,34 +58,34 @@
5858
builder.Services.AddEndpointsApiExplorer();
5959
builder.Services.AddSwaggerGen(c =>
6060
{
61-
c.SwaggerDoc("v1", new OpenApiInfo
61+
c.SwaggerDoc("v1", new()
6262
{
6363
Title = "User Management API",
6464
Version = "v1",
6565
Description = "API for user authentication, authorization and management"
6666
});
6767

6868
// Bearer token support
69-
var jwtSecurityScheme = new OpenApiSecurityScheme
69+
var jwtSecurityScheme = new Microsoft.OpenApi.Models.OpenApiSecurityScheme
7070
{
7171
Scheme = "bearer",
7272
BearerFormat = "JWT",
7373
Name = "Authorization",
74-
In = ParameterLocation.Header,
75-
Type = SecuritySchemeType.Http,
74+
In = Microsoft.OpenApi.Models.ParameterLocation.Header,
75+
Type = Microsoft.OpenApi.Models.SecuritySchemeType.Http,
7676
Description = "JWT auth using Bearer scheme. Paste **only** the token below.",
7777

78-
Reference = new OpenApiReference
78+
Reference = new Microsoft.OpenApi.Models.OpenApiReference
7979
{
8080
Id = "Bearer",
81-
Type = ReferenceType.SecurityScheme
81+
Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme
8282
}
8383
};
8484

8585
c.AddSecurityDefinition("Bearer", jwtSecurityScheme);
8686

8787
// Require Bearer token for all operations (you can remove if you prefer per-endpoint)
88-
c.AddSecurityRequirement(new OpenApiSecurityRequirement
88+
c.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement
8989
{
9090
{ jwtSecurityScheme, Array.Empty<string>() }
9191
});
@@ -117,8 +117,7 @@
117117

118118
// Configure the HTTP request pipeline.
119119
if (app.Environment.IsDevelopment())
120-
{
121-
app.MapOpenApi();
120+
{
122121
app.UseSwagger();
123122
app.UseSwaggerUI(c =>
124123
{

UserManagementApi/appsettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
"Jwt": {
2828
"Issuer": "PermsApi",
2929
"Audience": "PermsApiAudience",
30-
"KeyBase64": "dmVyeV9sb25nX2Rldl9rZXlfY2hhbmdlX2luX3Byb2RfMTIzNDU2Nzg5MA==",
30+
"Key": "dmVyeV9sb25nX2Rldl9rZXlfY2hhbmdlX2luX3Byb2RfMTIzNDU2Nzg5MA==",
3131
"ExpiresMinutes": 60
3232
}
3333

0 commit comments

Comments
 (0)