This commit is contained in:
max 2025-05-18 18:03:40 +02:00
parent b3763fb795
commit 217c55df00
8 changed files with 75 additions and 22 deletions

View File

@ -27,6 +27,14 @@ public static class AuthorityDefaults
public const string Default = "/";
public const string Login = "/auth/login";
public const string Logout = "/auth/logout";
public const string Challenge = "/auth/challenge";
public const string Forbidden = "/forbidden";
public const string Info = "/info";
}
public static class ClaimTypes
{
public const string Attribute = "Authority.Attribute";
public const string AuthenticatedScheme = "Authority.Scheme.Authenticated";
}
}

View File

@ -1,4 +1,6 @@
using System.Text.Json;
using DotBased.AspNet.Authority.Models.Data.System;
using DotBased.AspNet.Authority.Services;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
@ -9,7 +11,7 @@ namespace DotBased.AspNet.Authority.Controllers;
[Route("[controller]")]
public class AuthorityController(IAuthenticationService authenticationService) : ControllerBase
{
[HttpGet("auth/login")]
[HttpGet(AuthorityDefaults.Paths.Login)]
[AllowAnonymous]
public async Task<ActionResult> LoginFromSchemeAsync([FromQuery(Name = "s")] string? scheme, [FromQuery(Name = "ss")] string? sessionScheme)
{
@ -17,17 +19,41 @@ public class AuthorityController(IAuthenticationService authenticationService) :
return Ok();
}
[HttpGet("auth/logout")]
[HttpGet(AuthorityDefaults.Paths.Challenge)]
[AllowAnonymous]
public IActionResult ChallengeLogin([FromQuery(Name = "s")] string? scheme, [FromQuery(Name = "returnUrl")] string returnUrl = "/")
{
return Challenge(scheme, returnUrl);
}
[HttpGet(AuthorityDefaults.Paths.Logout)]
public async Task<ActionResult> LogoutAsync()
{
await HttpContext.SignOutAsync();
return Ok();
}
[HttpGet("info")]
[HttpGet(AuthorityDefaults.Paths.Info)]
[AllowAnonymous]
public async Task<ActionResult<JsonDocument>> GetAuthorityInfoAsync()
{
return Ok();
if (authenticationService is not AuthorityAuthenticationService authService)
{
return BadRequest();
}
var schemesInfos = authService.GetAllSchemeInfos();
var info = new AuthorityInformation
{
IsAuthenticated = false,
SchemeInformation = new SchemeInformation
{
DefaultScheme = authService.Options.DefaultScheme ?? "Unknown",
AvailableSchemes = schemesInfos.ToList()
}
};
return Ok(info);
}
}

View File

@ -19,8 +19,9 @@ public class AuthorityLoginAuthenticationHandler(IOptionsMonitor<AuthorityLoginO
// Validate credentials
protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
{
var ticket = new AuthenticationTicket(new ClaimsPrincipal(), Scheme.Name);
var result = AuthenticateResult.Success(ticket);
//TODO: Check headers for login credentials.
/*var ticket = new AuthenticationTicket(new ClaimsPrincipal(), Scheme.Name);*/
var result = AuthenticateResult.Fail("No login found!");
return result;
}
}

View File

@ -1,10 +0,0 @@
using DotBased.AspNet.Authority.Models.Data.Auth;
namespace DotBased.AspNet.Authority.Models.Data.System;
public class AboutModel
{
public string Name { get; set; } = "Authority.Server";
public List<AuthenticationType> AuthenticationTypes { get; set; } = [];
public List<AuthenticationSessionType> SessionTypes { get; set; } = [];
}

View File

@ -0,0 +1,25 @@
using DotBased.AspNet.Authority.Models.Data.Auth;
using DotBased.AspNet.Authority.Models.Options.Auth;
namespace DotBased.AspNet.Authority.Models.Data.System;
public class AuthorityInformation
{
public string ServerName { get; set; } = "Authority.Server";
public bool IsAuthenticated { get; set; }
public List<AuthenticationType> AuthenticationTypes { get; set; } = [];
public List<AuthenticationSessionType> SessionTypes { get; set; } = [];
public SchemeInformation? SchemeInformation { get; set; }
public AuthenticatedInformation? AuthenticatedInformation { get; set; }
}
public class SchemeInformation
{
public string? DefaultScheme { get; set; }
public List<SchemeInfo> AvailableSchemes { get; set; } = [];
}
public class AuthenticatedInformation
{
public string? AuthenticatedScheme { get; set; }
}

View File

@ -22,6 +22,7 @@ public class SchemeInfo
public string Description { get; set; } = string.Empty;
public SchemeType Type { get; set; }
public string AuthenticationType { get; set; } = string.Empty;
public string? Endpoint { get; set; }
}
public enum SchemeType

View File

@ -27,7 +27,7 @@ public class AuthorityAuthenticationService(
return base.AuthenticateAsync(context, scheme);
}
// Trigger login
// Trigger login - Redirects to provider (OIDC, etc.)
// Used when access to a resource requires authentication, but the user has not provided valid credentials.
public override Task ChallengeAsync(HttpContext context, string? scheme, AuthenticationProperties? properties)
{

View File

@ -33,23 +33,25 @@ builder.Services.AddAuthority()
.MapAuthorityEndpoints()
.AddAuthorityAuth(options =>
{
options.DefaultScheme = AuthorityDefaults.Scheme.Cookie.AuthenticationScheme;
options.DefaultSignInScheme = AuthorityDefaults.Scheme.Authority.AuthenticationScheme;
options.DefaultSignOutScheme = AuthorityDefaults.Scheme.Authority.AuthenticationScheme;
options.DefaultScheme = AuthorityDefaults.Scheme.Authority.AuthenticationScheme;
options.DefaultSignInScheme = AuthorityDefaults.Scheme.Cookie.AuthenticationScheme;
options.DefaultSignOutScheme = AuthorityDefaults.Scheme.Cookie.AuthenticationScheme;
options.SchemeInfoMap = [
new SchemeInfo
{
Scheme = AuthorityDefaults.Scheme.Authority.AuthenticationScheme,
Description = "Authority password login",
Type = SchemeType.Authentication,
AuthenticationType = "Password"
AuthenticationType = "Password",
Endpoint = AuthorityDefaults.Paths.Login
},
/*new SchemeInfo
{
Scheme = "OIDC",
Description = "Authentik OIDC login",
Type = SchemeType.Authentication,
AuthenticationType = "OpenIdConnect"
AuthenticationType = "OpenIdConnect",
Endpoint = AuthorityDefaults.Paths.Challenge
},*/
new SchemeInfo
{