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.");
}
}
}