https://github.com/ediwang/edi.aspnetcore.jwt
JWT authentication library for my own
https://github.com/ediwang/edi.aspnetcore.jwt
jwt
Last synced: 11 months ago
JSON representation
JWT authentication library for my own
- Host: GitHub
- URL: https://github.com/ediwang/edi.aspnetcore.jwt
- Owner: EdiWang
- License: mit
- Created: 2023-06-19T05:42:48.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2025-02-27T04:27:10.000Z (over 1 year ago)
- Last Synced: 2025-05-15T02:36:35.233Z (about 1 year ago)
- Topics: jwt
- Language: C#
- Homepage:
- Size: 144 KB
- Stars: 4
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Edi.AspNetCore.Jwt
[](https://github.com/EdiWang/Edi.AspNetCore.Jwt/actions/workflows/dotnet.yml)
A very basic JWT authentication library for quickly integrating JWT authentication in ASP.NET Core applications.
## Install
```powershell
dotnet add package Edi.AspNetCore.Jwt
```
For SQL Server token storage, also
```powershell
dotnet add package Edi.AspNetCore.Jwt.SqlServer
```
## Usage
### ASP.NET Core
#### `Program.cs`
```csharp
builder.Services.AddJwtAuth(builder.Configuration)
.AddInMemoryRefreshTokenStore();
// For SQL Server token storage, also
// .AddSqlServerRefreshTokenStore("DefaultConnection");
```
#### `appsettings.json`
```json
"JWTConfig": {
"Secret": "b9e942ac-dd01-4523-9e0e-21f4f642fe74",
"Issuer": "edi.wang",
"Audience": "edi",
"AccessTokenExpiration": 20,
"RefreshTokenExpiration": 480
}
```
For SQL Server token storage, also
```json
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=work996;Trusted_Connection=True;"
}
```
#### DI
```csharp
private readonly IJwtAuthManager _jwtAuthManager;
public AccountController(IJwtAuthManager jwtAuthManager)
{
_jwtAuthManager = jwtAuthManager;
}
```
#### Sign In
```csharp
var claims = new List
{
new("UserId", user.Id.ToString()),
new(ClaimTypes.Name, user.DisplayName),
new(ClaimTypes.Email, request.Email),
};
claims.AddRange(user.Roles.Select(role => (Claim)new(ClaimTypes.Role, role.ShortCode)));
var jwtResult = _jwtAuthManager.GenerateTokens(request.Email, claims.ToArray(), DateTime.UtcNow);
SetRefreshTokenCookie(jwtResult.RefreshToken.TokenString);
return Ok(new LoginResult
{
AccessToken = jwtResult.AccessToken.TokenString
});
```
```csharp
private void SetRefreshTokenCookie(string token)
{
var cookieOptions = new CookieOptions
{
Secure = true,
SameSite = SameSiteMode.None,
HttpOnly = true,
Expires = DateTime.UtcNow.AddMinutes(_jwtAuthManager.JwtTokenConfig.RefreshTokenExpiration)
};
Response.Cookies.Append("refreshToken", token, cookieOptions);
}
```
#### Refresh Token
```csharp
var refreshToken = Request.Cookies["refreshToken"];
var hasAuthHeader = Request.Headers.TryGetValue("Authorization", out var authHeaderValue);
if (!hasAuthHeader) return Unauthorized("No Authorization header");
var parseAuthHeader = AuthenticationHeaderValue.TryParse(authHeaderValue, out var accessToken);
if (!parseAuthHeader) return Unauthorized("Unable to parse Authorization header");
var jwtResult = _jwtAuthManager.Refresh(refreshToken, accessToken.Parameter, ClaimTypes.Email, DateTime.UtcNow);
SetRefreshTokenCookie(jwtResult.RefreshToken.TokenString);
return Ok(jwtResult);
```
#### Sign Out
```csharp
var email = User.FindFirst(p => p.Type == ClaimTypes.Email)?.Value;
_jwtAuthManager.RemoveRefreshToken(email);
```