using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; using RobotNet.IdentityServer.Data; using static OpenIddict.Abstractions.OpenIddictConstants; namespace RobotNet.IdentityServer.Controllers; [EnableCors("RequestAuthorize")] [Route("api/[controller]")] [ApiController] public class UserinfoController(UserManager userManager) : ControllerBase {// GET: /api/userinfo [Authorize(AuthenticationSchemes = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)] [HttpGet(""), HttpPost(""), 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); } }