- Created MemberCenter.Installer project with references to Infrastructure, Application, and Domain projects. - Added Program.cs with a basic console output. - Generated MemberCenterDbContextModelSnapshot for database schema representation.
75 lines
2.6 KiB
C#
75 lines
2.6 KiB
C#
using MemberCenter.Api.Extensions;
|
|
using MemberCenter.Infrastructure.Identity;
|
|
using Microsoft.AspNetCore.Authentication;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using OpenIddict.Abstractions;
|
|
using OpenIddict.Server.AspNetCore;
|
|
|
|
namespace MemberCenter.Api.Controllers;
|
|
|
|
[ApiController]
|
|
public class TokenController : ControllerBase
|
|
{
|
|
private readonly UserManager<ApplicationUser> _userManager;
|
|
private readonly SignInManager<ApplicationUser> _signInManager;
|
|
|
|
public TokenController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager)
|
|
{
|
|
_userManager = userManager;
|
|
_signInManager = signInManager;
|
|
}
|
|
|
|
[HttpPost("/oauth/token")]
|
|
[HttpPost("/auth/login")]
|
|
[HttpPost("/auth/refresh")]
|
|
public async Task<IActionResult> Exchange()
|
|
{
|
|
var request = HttpContext.Features.Get<OpenIddictServerAspNetCoreFeature>()?.Transaction?.Request;
|
|
if (request is null)
|
|
{
|
|
return BadRequest("Invalid OpenIddict request.");
|
|
}
|
|
|
|
if (request.IsPasswordGrantType())
|
|
{
|
|
var user = await _userManager.FindByEmailAsync(request.Username ?? string.Empty);
|
|
if (user is null)
|
|
{
|
|
return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
|
}
|
|
|
|
var valid = await _userManager.CheckPasswordAsync(user, request.Password ?? string.Empty);
|
|
if (!valid)
|
|
{
|
|
return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
|
}
|
|
|
|
var principal = await _signInManager.CreateUserPrincipalAsync(user);
|
|
var scopes = request.Scope.GetScopesOrDefault();
|
|
principal.SetScopes(scopes);
|
|
|
|
foreach (var claim in principal.Claims)
|
|
{
|
|
claim.SetDestinations(ClaimsExtensions.GetDestinations(claim));
|
|
}
|
|
|
|
return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
|
}
|
|
|
|
if (request.IsRefreshTokenGrantType())
|
|
{
|
|
var authenticateResult = await HttpContext.AuthenticateAsync(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
|
if (!authenticateResult.Succeeded || authenticateResult.Principal is null)
|
|
{
|
|
return Forbid(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
|
}
|
|
|
|
var principal = authenticateResult.Principal;
|
|
return SignIn(principal, OpenIddictServerAspNetCoreDefaults.AuthenticationScheme);
|
|
}
|
|
|
|
return BadRequest("Unsupported grant type.");
|
|
}
|
|
}
|