Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# 🚀 Pull Request

<!-- Thank you for contributing to **UltimateAuth**! -->
<!-- Please complete the following checklist to help us review your PR effectively.-->

Expand Down
8 changes: 4 additions & 4 deletions .github/codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ coverage:
status:
project:
default:
target: 70%
threshold: 0%
target: 80%
threshold: 2%
patch:
default:
target: 50%
threshold: 0%
target: 80%
threshold: 5%
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ UltimateAuth is an open-source auth framework with platform-level capabilities t
| Phase | Version | Scope | Status | Release Date |
| ----------------------- | ------------- | ----------------------------------------- | -------------- | ------------ |
| First Preview | 0.1.0-preview | "Stable" Preview Core | ✅ Completed | 07.04.2026 |
| First Release* | 0.1.0 | Fully Documented & Quality Tested | ✅ Completed | 08.10.2026 |
| First Release* | 0.1.0 | Documented & Quality Tested | ✅ Completed | 08.10.2026 |
| Product Expansion | 0.2.0 | Full Auth Modes | 🟡 In Progress | Q4 2026 |
| Security Expansion | 0.3.0 | MFA, Reauth, Rate Limiting | 🟡 In Progress | Q4 2026 |
| Infrastructure Expansion| 0.4.0 | Redis, Distributed Cache, Password Hasher | 🔜 Planned | Q1 2027 |
Expand Down
57 changes: 3 additions & 54 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,10 @@
# UltimateAuth Roadmap
This document outlines the planned development phases of UltimateAuth.
Dates are targets and may evolve based on community feedback and real-world usage.
> The project roadmap is actively maintained as a GitHub issue:

---

## 🟣 Q1 2026 — Preview (v 0.1.0)
The first public preview of UltimateAuth:
- Core session-based auth engine
- Secure opaque SessionId tokens
- Basic login / logout / refresh and PKCE flows
- Blazor & MAUI client foundations
- Initial server abstractions and extension points
- Early documentation and samples
👉 https://github.com/CodeBeamOrg/UltimateAuth/issues/8

---

## 🟣 Q2 2026 — Stable Feature Release
Focus on stabilization, developer experience, and broader platform support:
- Hardened session lifecycle
- Expanded testing and validation
- Improved client SDK flows
- ASP.NET Core middleware polishing
- More complete documentation
- First public samples for real applications

---

## 🟣 Q3 2026 — Version 1.0.0 (General Availability)
UltimateAuth reaches production-readiness:
- API surface finalized and locked
- Full PKCE/OAuth-style flow support
- Unified architecture across client & server
- Performance improvements
- Security review & hardening
- Real-world feedback applied
- Long-term support model established

---

## 🟣 Q4 2026 — .NET 11 Alignment (v11.x.x)
UltimateAuth aligns its versioning and platform features with .NET 11:
- Framework-wide modernization updates
- Future-proof API adjustments
- Compatibility refinements

---

## 🟣 Beyond 2026 — Long-Term Vision
- Advanced OAuth integrations
- External identity provider modules
- Enhanced build-in security features (MFA, biometrics)
- Extended session storage providers
- Developer tooling & templates
- Deep Blazor/Maui experience enhancements
- Distributed session management options

---
UltimateAuth is developed openly and shaped by community feedback.

UltimateAuth is developed openly and shaped by community feedback.
Thank you for helping us build the next-generation authentication framework for .NET.
1 change: 1 addition & 0 deletions UltimateAuth.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
<File Path="Roadmap.md" />
</Folder>
<Folder Name="/Tests/">
<Project Path="tests/CodeBeam.UltimateAuth.Tests.Integration.EfCore/CodeBeam.UltimateAuth.Tests.Integration.EfCore.csproj" Id="51652abe-8f77-4150-94ea-976ca41c8b91" />
<Project Path="tests/CodeBeam.UltimateAuth.Tests.Integration/CodeBeam.UltimateAuth.Tests.Integration.csproj" Id="fe34a0b1-8038-400d-b8ab-02dad7051f2d" />
<Project Path="tests/CodeBeam.UltimateAuth.Tests.Unit/CodeBeam.UltimateAuth.Tests.Unit.csproj" Id="6f4b22da-849a-4a79-b5c5-aee7cb1429a6" />
</Folder>
Expand Down
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using CodeBeam.UltimateAuth.Core.Contracts;
//using CodeBeam.UltimateAuth.Core.Contracts;

namespace CodeBeam.UltimateAuth.Core.Abstractions;
//namespace CodeBeam.UltimateAuth.Core.Abstractions;

public interface IAuthContextFactory
{
AuthContext Create(DateTimeOffset? at = null);
}
//public interface IAuthContextFactory
//{
// AuthContext Create(DateTimeOffset? at = null);
//}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using CodeBeam.UltimateAuth.Core.Options;

namespace CodeBeam.UltimateAuth.Core.Abstractions;

public interface IUAuthMultiTenantOptionsAccessor
{
UAuthMultiTenantOptions MultiTenant { get; }
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
using CodeBeam.UltimateAuth.Core.Contracts;
//using CodeBeam.UltimateAuth.Core.Contracts;

namespace CodeBeam.UltimateAuth.Core.Abstractions;
//namespace CodeBeam.UltimateAuth.Core.Abstractions;

/// <summary>
/// Validates access tokens (JWT or opaque) and resolves
/// the authenticated user context.
/// </summary>
public interface IJwtValidator
{
Task<TokenValidationResult<TUserId>> ValidateAsync<TUserId>(string token, CancellationToken ct = default);
}
///// <summary>
///// Validates access tokens (JWT or opaque) and resolves
///// the authenticated user context.
///// </summary>
//public interface IJwtValidator
//{
// Task<TokenValidationResult<TUserId>> ValidateAsync<TUserId>(string token, CancellationToken ct = default);
//}
1 change: 1 addition & 0 deletions src/CodeBeam.UltimateAuth.Core/AssemblyVisibility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
[assembly: InternalsVisibleTo("CodeBeam.UltimateAuth.Authentication.EntityFrameworkCore")]
[assembly: InternalsVisibleTo("CodeBeam.UltimateAuth.Tests.Unit")]
[assembly: InternalsVisibleTo("CodeBeam.UltimateAuth.Tests.Integration")]
[assembly: InternalsVisibleTo("CodeBeam.UltimateAuth.Tests.Integration.EfCore")]
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,12 @@
public enum RefreshTokenPersistence
{
/// <summary>
/// Refresh token store'a yazılır.
/// Login, first-issue gibi normal akışlar için.
/// Refresh token persists to the store.
/// </summary>
Persist = 0,

/// <summary>
/// Refresh token store'a yazılmaz.
/// Rotation gibi özel akışlarda,
/// caller tarafından kontrol edilir.
/// Refresh token does not persist to the store.
/// </summary>
DoNotPersist = 10
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,18 @@

namespace CodeBeam.UltimateAuth.Core.Contracts;

// TODO: Validation protocol review after SemiHybrid/PureJwt: Re-evaluate exposure and necessity of
// ChainId, RootId, and BoundDeviceId in AuthValidationResult once all AuthModes have concrete validation semantics.
// Prefer the smallest common public contract and keep security lineage internal where possible.
public sealed record AuthValidationResult
{
public required SessionState State { get; init; }
public AuthStateSnapshot? Snapshot { get; init; }
public Guid? ChainId { get; init; }

public Guid? RootId { get; init; }

public string? BoundDeviceId { get; init; }

public bool IsValid => State == SessionState.Active;
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,35 +1,35 @@
using CodeBeam.UltimateAuth.Core.Domain;
//using CodeBeam.UltimateAuth.Core.Domain;

namespace CodeBeam.UltimateAuth.Core.Contracts;
//namespace CodeBeam.UltimateAuth.Core.Contracts;

public sealed record ResolvedRefreshSession
{
public bool IsValid { get; init; }
public bool IsReuseDetected { get; init; }
//public sealed record ResolvedRefreshSession
//{
// public bool IsValid { get; init; }
// public bool IsReuseDetected { get; init; }

public UAuthSession? Session { get; init; }
public UAuthSessionChain? Chain { get; init; }
// public UAuthSession? Session { get; init; }
// public UAuthSessionChain? Chain { get; init; }

private ResolvedRefreshSession() { }
// private ResolvedRefreshSession() { }

public static ResolvedRefreshSession Invalid()
=> new()
{
IsValid = false
};
// public static ResolvedRefreshSession Invalid()
// => new()
// {
// IsValid = false
// };

public static ResolvedRefreshSession Reused()
=> new()
{
IsValid = false,
IsReuseDetected = true
};
// public static ResolvedRefreshSession Reused()
// => new()
// {
// IsValid = false,
// IsReuseDetected = true
// };

public static ResolvedRefreshSession Valid(UAuthSession session, UAuthSessionChain chain)
=> new()
{
IsValid = true,
Session = session,
Chain = chain
};
}
// public static ResolvedRefreshSession Valid(UAuthSession session, UAuthSessionChain chain)
// => new()
// {
// IsValid = true,
// Session = session,
// Chain = chain
// };
//}
28 changes: 14 additions & 14 deletions src/CodeBeam.UltimateAuth.Core/Contracts/Token/PrimaryToken.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
using CodeBeam.UltimateAuth.Core.Domain;
//using CodeBeam.UltimateAuth.Core.Domain;

namespace CodeBeam.UltimateAuth.Core.Contracts;
//namespace CodeBeam.UltimateAuth.Core.Contracts;

public sealed record PrimaryToken
{
public PrimaryTokenKind Kind { get; }
public string Value { get; }
//public sealed record PrimaryToken
//{
// public PrimaryTokenKind Kind { get; }
// public string Value { get; }

private PrimaryToken(PrimaryTokenKind kind, string value)
{
Kind = kind;
Value = value;
}
// private PrimaryToken(PrimaryTokenKind kind, string value)
// {
// Kind = kind;
// Value = value;
// }

public static PrimaryToken FromSession(AuthSessionId sessionId) => new(PrimaryTokenKind.Session, sessionId.ToString());
// public static PrimaryToken FromSession(AuthSessionId sessionId) => new(PrimaryTokenKind.Session, sessionId.ToString());

public static PrimaryToken FromAccessToken(AccessToken token) => new(PrimaryTokenKind.AccessToken, token.Token);
}
// public static PrimaryToken FromAccessToken(AccessToken token) => new(PrimaryTokenKind.AccessToken, token.Token);
//}

This file was deleted.

Loading
Loading