skills/authentication/SKILL.md
Implement authentication and authorization for .NET Minimal API. Covers JWT bearer tokens, claims-based authorization, policy-based RBAC, row-level access control, and middleware setup. Use when: adding auth to endpoints, configuring JWT validation, creating authorization policies, implementing owner vs shared user access, or setting up identity.
npx skillsauth add congiuluc/my-awesome-copilot authenticationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
[Authorize] or policy requirements to endpointsbuilder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = builder.Configuration["Auth:Authority"];
options.Audience = builder.Configuration["Auth:Audience"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ClockSkew = TimeSpan.FromMinutes(1)
};
});
ClockSkew to a small value (1-2 minutes).builder.Services.AddAuthorizationBuilder()
.AddPolicy("Owner", policy =>
policy.Requirements.Add(new ResourceOwnerRequirement()))
.AddPolicy("Admin", policy =>
policy.RequireClaim("role", "admin"))
.AddPolicy("SharedAccess", policy =>
policy.Requirements.Add(new SharedAccessRequirement()));
IAuthorizationHandler for custom requirement logic./// <summary>
/// Checks if the current user owns the resource or has shared access.
/// </summary>
public class ResourceOwnerHandler : AuthorizationHandler<ResourceOwnerRequirement, IOwnedResource>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
ResourceOwnerRequirement requirement,
IOwnedResource resource)
{
var userId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
if (resource.OwnerId == userId)
{
context.Succeed(requirement);
}
return Task.CompletedTask;
}
}
group.MapGet("/{id}", GetByIdAsync)
.RequireAuthorization();
group.MapPut("/{id}", UpdateAsync)
.RequireAuthorization("Owner");
group.MapDelete("/{id}", DeleteAsync)
.RequireAuthorization("Owner");
RequireAuthorization() enforces authentication.RequireAuthorization("PolicyName") enforces a specific policy.public static class ClaimsPrincipalExtensions
{
public static string GetUserId(this ClaimsPrincipal user)
=> user.FindFirst(ClaimTypes.NameIdentifier)?.Value
?? throw new UnauthorizedException("User ID claim missing");
public static string GetEmail(this ClaimsPrincipal user)
=> user.FindFirst(ClaimTypes.Email)?.Value ?? string.Empty;
}
UnauthorizedException if required claims are missing.if (user.IsInRole("admin")) inline in endpoint handlersappsettings.json[AllowAnonymous] on mutation endpointstools
Build VS Code extensions with TypeScript. Covers extension anatomy, activation events, commands, tree views, webview panels, language features, testing, and publishing. Use when: creating a new VS Code extension, adding commands/views/providers, building webview UIs, implementing language server features, testing extensions, or packaging for the marketplace.
development
Track implementations, features, bugs, and releases in a versioning document. Use when: adding a commit, completing a feature, fixing a bug, or preparing a release. Automatically updates CHANGELOG.md following Keep a Changelog format and Semantic Versioning.
development
Write frontend tests using Vitest and React Testing Library. Use when: testing React components, hooks, user interactions, form submissions, accessibility assertions, or mocking API services.
development
Write Angular frontend tests using Jasmine, Karma, and Angular TestBed. Use when: testing Angular components, services, pipes, directives, user interactions, form submissions, accessibility assertions, or mocking HTTP services.