public async Task When_A_Consent_Has_Been_Given_And_The_AuthorizationFlow_Is_Not_Supported_Then_Exception_Is_Thrown()
        {
            // ARRANGE
            InitializeFakeObjects();
            const string clientId               = "clientId";
            const string state                  = "state";
            var          claimsIdentity         = new ClaimsIdentity();
            var          claimsPrincipal        = new ClaimsPrincipal(claimsIdentity);
            var          responseTypes          = new List <ResponseType>();
            var          authorizationParameter = new AuthorizationParameter
            {
                ClientId     = clientId,
                State        = state,
                ResponseMode = ResponseMode.None // No response mode is defined
            };
            var consent = new Core.Models.Consent();

            _clientRepositoryFake.Setup(c => c.GetClientByIdAsync(It.IsAny <string>()))
            .Returns(Task.FromResult(new Client()));
            _consentHelperFake.Setup(c => c.GetConfirmedConsentsAsync(It.IsAny <string>(),
                                                                      It.IsAny <AuthorizationParameter>()))
            .Returns(Task.FromResult(consent));
            _parameterParserHelperFake.Setup(p => p.ParseResponseTypes(It.IsAny <string>()))
            .Returns(responseTypes);

            // ACT & ASSERTS
            var exception = await Assert.ThrowsAsync <IdentityServerExceptionWithState>(() => _displayConsentAction.Execute(authorizationParameter,
                                                                                                                            claimsPrincipal));

            Assert.True(exception.Code == ErrorCodes.InvalidRequestCode);
            Assert.True(exception.Message == ErrorDescriptions.TheAuthorizationFlowIsNotSupported);
            Assert.True(exception.State == state);
        }
        public async Task When_A_Consent_Has_Been_Given_Then_Redirect_To_Callback()
        {
            // ARRANGE
            InitializeFakeObjects();
            var claimsIdentity  = new ClaimsIdentity();
            var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
            var actionResult    = new ActionResult
            {
                RedirectInstruction = new RedirectInstruction()
            };
            var authorizationParameter = new AuthorizationParameter
            {
                ResponseMode = ResponseMode.fragment
            };
            var consent = new Core.Models.Consent();

            _clientRepositoryFake.Setup(c => c.GetClientByIdAsync(It.IsAny <string>()))
            .Returns(Task.FromResult(new Client()));
            _consentHelperFake.Setup(c => c.GetConfirmedConsentsAsync(It.IsAny <string>(),
                                                                      It.IsAny <AuthorizationParameter>()))
            .Returns(Task.FromResult(consent));
            _actionResultFactoryFake.Setup(a => a.CreateAnEmptyActionResultWithRedirectionToCallBackUrl())
            .Returns(actionResult);

            // ACT
            var result = await _displayConsentAction.Execute(authorizationParameter, claimsPrincipal);

            // ASSERT
            _actionResultFactoryFake.Verify(a => a.CreateAnEmptyActionResultWithRedirectionToCallBackUrl());
            Assert.True(result.ActionResult.RedirectInstruction.ResponseMode == ResponseMode.fragment);
        }
        public async Task <bool> DeleteAsync(Core.Models.Consent record)
        {
            using (var transaction = _context.Database.BeginTransaction())
            {
                try
                {
                    var consent = await _context.Consents.FirstOrDefaultAsync(c => c.Id == record.Id).ConfigureAwait(false);

                    if (consent == null)
                    {
                        return(false);
                    }

                    _context.Consents.Remove(consent);
                    await _context.SaveChangesAsync().ConfigureAwait(false);

                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    _managerEventSource.Failure(ex);
                    transaction.Rollback();
                    return(false);
                }
            }

            return(true);
        }
        public async Task When_Consent_Has_Already_Been_Given_Then_Redirect_To_Callback()
        {
            // ARRANGE
            InitializeFakeObjects();
            const string subject = "subject";
            const string code    = "code";
            var          prompts = new List <PromptParameter>
            {
                PromptParameter.none
            };
            var actionResult = new ActionResult
            {
                RedirectInstruction = new RedirectInstruction()
            };
            var consent = new Core.Models.Consent();
            var authorizationParameter = new AuthorizationParameter
            {
                ResponseMode = ResponseMode.form_post
            };
            var claims = new List <Claim>();

            _clientRepositoryStub.Setup(c => c.GetClientByIdAsync(It.IsAny <string>()))
            .Returns(Task.FromResult(new Client()));
            _parameterParserHelperFake.Setup(p => p.ParsePrompts(It.IsAny <string>()))
            .Returns(prompts);
            _consentHelperFake.Setup(c => c.GetConfirmedConsentsAsync(It.IsAny <string>(),
                                                                      It.IsAny <AuthorizationParameter>()))
            .Returns(Task.FromResult(consent));
            _actionResultFactoryFake.Setup(a => a.CreateAnEmptyActionResultWithRedirectionToCallBackUrl())
            .Returns(actionResult);

            // ACT
            actionResult = await _authenticateHelper.ProcessRedirection(authorizationParameter,
                                                                        code,
                                                                        subject,
                                                                        claims);

            // ASSERTS
            Assert.True(actionResult.RedirectInstruction.ResponseMode == ResponseMode.form_post);
        }
        public async Task <Core.Models.Consent> InsertAsync(Core.Models.Consent record)
        {
            Core.Models.Consent result = null;
            using (var transaction = _context.Database.BeginTransaction())
            {
                try
                {
                    var clientId        = record.Client.ClientId;
                    var resourceOwnerId = record.ResourceOwner.Id;
                    var client          = await _context.Clients.FirstOrDefaultAsync(c => c.ClientId == clientId).ConfigureAwait(false);

                    var resourceOwner = await _context.ResourceOwners.FirstOrDefaultAsync(r => r.Id == resourceOwnerId).ConfigureAwait(false);

                    var assignedClaims = new List <ConsentClaim>();
                    var assignedScopes = new List <ConsentScope>();
                    if (record.Claims != null)
                    {
                        var claimCodes = record.Claims;
                        var codes      = await _context.Claims.Where(c => claimCodes.Contains(c.Code)).Select(c => c.Code).ToListAsync().ConfigureAwait(false);

                        foreach (var code in codes)
                        {
                            assignedClaims.Add(new ConsentClaim
                            {
                                ClaimCode = code
                            });
                        }
                    }

                    if (record.GrantedScopes != null)
                    {
                        var scopeNames = record.GrantedScopes.Select(g => g.Name);
                        var names      = await _context.Scopes.Where(s => scopeNames.Contains(s.Name)).Select(s => s.Name).ToListAsync().ConfigureAwait(false);

                        foreach (var name in names)
                        {
                            assignedScopes.Add(new ConsentScope
                            {
                                ScopeName = name
                            });
                        }
                    }

                    var newConsent = new Consent
                    {
                        Id            = Guid.NewGuid().ToString(),
                        Client        = client,
                        ResourceOwner = resourceOwner,
                        ConsentClaims = assignedClaims,
                        ConsentScopes = assignedScopes
                    };

                    var insertedConsent = _context.Consents.Add(newConsent);
                    await _context.SaveChangesAsync().ConfigureAwait(false);

                    transaction.Commit();
                    result = insertedConsent.Entity.ToDomain();
                }
                catch (Exception ex)
                {
                    _managerEventSource.Failure(ex);
                    transaction.Rollback();
                }
            }

            return(result);
        }