using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Mvc.Server.Models; using Newtonsoft.Json.Linq; using OpenIddict.Abstractions; using OpenIddict.Server.AspNetCore; namespace Mvc.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"), Produces("application/json")] public async Task Userinfo() { var user = await _userManager.GetUserAsync(User); if (user == null) { return Challenge(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme); } var claims = new Dictionary(StringComparer.Ordinal); // Note: the "sub" claim is a mandatory claim and must be included in the JSON response. claims[OpenIddictConstants.Claims.Subject] = await _userManager.GetUserIdAsync(user); if (User.HasClaim(OpenIddictConstants.Claims.Scope, OpenIddictConstants.Scopes.Email)) { claims[OpenIddictConstants.Claims.Email] = await _userManager.GetEmailAsync(user); claims[OpenIddictConstants.Claims.EmailVerified] = await _userManager.IsEmailConfirmedAsync(user); } if (User.HasClaim(OpenIddictConstants.Claims.Scope, OpenIddictConstants.Scopes.Phone)) { claims[OpenIddictConstants.Claims.PhoneNumber] = await _userManager.GetPhoneNumberAsync(user); claims[OpenIddictConstants.Claims.PhoneNumberVerified] = await _userManager.IsPhoneNumberConfirmedAsync(user); } if (User.HasClaim(OpenIddictConstants.Claims.Scope, "roles")) { claims["roles"] = JArray.FromObject(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); } } }