using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; using Dantooine.Server.Data; using static OpenIddict.Abstractions.OpenIddictConstants; namespace Dantooine.Server.Controllers; public class UserinfoController : Controller { private readonly UserManager _userManager; public UserinfoController(UserManager userManager) => _userManager = userManager; // // GET: /api/userinfo [Authorize(AuthenticationSchemes = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)] [HttpGet("~/connect/userinfo"), HttpPost("~/connect/userinfo"), Produces("application/json")] public async Task Userinfo() { var user = await _userManager.FindByIdAsync(User.GetClaim(Claims.Subject)!); if (user == null) { return Challenge( authenticationSchemes: OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, properties: new AuthenticationProperties(new Dictionary { [OpenIddictServerAspNetCoreConstants.Properties.Error] = Errors.InvalidToken, [OpenIddictServerAspNetCoreConstants.Properties.ErrorDescription] = "The specified access token is bound to an account that no longer exists." })); } var claims = new Dictionary(StringComparer.Ordinal) { // Note: the "sub" claim is a mandatory claim and must be included in the JSON response. [Claims.Subject] = await _userManager.GetUserIdAsync(user) }; if (User.HasScope(Scopes.Email)) { claims[Claims.Email] = await _userManager.GetEmailAsync(user); claims[Claims.EmailVerified] = await _userManager.IsEmailConfirmedAsync(user); } if (User.HasScope(Scopes.Phone)) { claims[Claims.PhoneNumber] = await _userManager.GetPhoneNumberAsync(user); claims[Claims.PhoneNumberVerified] = await _userManager.IsPhoneNumberConfirmedAsync(user); } if (User.HasScope(Scopes.Roles)) { claims[Claims.Role] = await _userManager.GetRolesAsync(user); } // Note: the complete list of standard claims supported by the OpenID Connect specification // can be found here: http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims return Ok(claims); } }