using IdentityServer4.Services; using IdentityServer4.Stores; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.Threading.Tasks; using Teknik.Configuration; using Teknik.IdentityServer.Models; using Teknik.IdentityServer.Security; using Teknik.IdentityServer.Services; using Teknik.Logging; namespace Teknik.IdentityServer.Controllers { /// /// This controller processes the consent UI /// public class ConsentController : DefaultController { private readonly ConsentService _consent; public ConsentController( ILogger logger, Config config, IIdentityServerInteractionService interaction, IClientStore clientStore, IResourceStore resourceStore) : base(logger, config) { _consent = new ConsentService(interaction, clientStore, resourceStore, logger); } /// /// Shows the consent screen /// /// /// [HttpGet] public async Task Index(string returnUrl) { ViewBag.Title = "Application Consent"; var vm = await _consent.BuildViewModelAsync(returnUrl); if (vm != null) { return View("Index", vm); } throw new ApplicationException($"Unable to load consent view model."); } /// /// Handles the consent screen postback /// [HttpPost] [ValidateAntiForgeryToken] public async Task Index(ConsentInputModel model) { var result = await _consent.ProcessConsent(model); if (result.IsRedirect) { return Redirect(result.RedirectUri); } if (result.HasValidationError) { ModelState.AddModelError("", result.ValidationError); } if (result.ShowView) { return View("Index", result.ViewModel); } throw new ApplicationException($"Unable to load consent view model."); } } }