using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using OpenIddict.Sandbox.AspNetCore.Server.Models; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; using static OpenIddict.Abstractions.OpenIddictConstants; namespace OpenIddict.Sandbox.AspNetCore.Server.Controllers; public class UserInfoController : Controller { private readonly UserManager _userManager; public UserInfoController(UserManager userManager) => _userManager = userManager; [Authorize(AuthenticationSchemes = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)] [HttpGet("~/connect/userinfo"), HttpPost("~/connect/userinfo")] [IgnoreAntiforgeryToken, Produces("application/json")] public async Task UserInfo() { var user = await _userManager.FindByIdAsync(User.GetClaim(Claims.Subject)!); if (user is 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); } }