protected override async Task <AuthenticateResult> HandleRemoteAuthenticateAsync()
        {
            var query = Request.Query;
            var state = query["state"];

            var properties = Options.StateDataFormat.Unprotect(state);

            if (properties == null)
            {
                return(AuthenticateResult.Fail("The state was missing or invalid."));
            }

            // CSRF
            if (!ValidateCorrelationId(properties))
            {
                return(AuthenticateResult.Fail("Correlation failed."));
            }

            var ticket = query["ticket"];

            if (string.IsNullOrEmpty(ticket))
            {
                return(AuthenticateResult.Fail("Missing CAS ticket."));
            }

            var           service   = BuildRedirectUri($"{Options.CallbackPath}?state={Uri.EscapeDataString(state)}");
            ICasPrincipal principal = null;

            try
            {
                principal = await Options.ServiceTicketValidator.ValidateAsync(ticket, service, Context.RequestAborted);
            }
            catch (Exception e)
            {
                Logger.LogWarning(e.Message, e);
                return(AuthenticateResult.Fail("There was a problem validating ticket."));
            }
            if (principal == null)
            {
                return(AuthenticateResult.Fail("Missing Validate Principal."));
            }
            if (Options.UseTicketStore)
            {
                properties.SetServiceTicket(ticket);
            }
            var ticketContext = new CasCreatingTicketContext(Context, Options)
            {
                Principal  = principal as ClaimsPrincipal ?? new ClaimsPrincipal(principal),
                Properties = properties
            };
            await Options.Events.CreatingTicket(ticketContext);

            return(AuthenticateResult.Success(new AuthenticationTicket(
                                                  ticketContext.Principal,
                                                  ticketContext.Properties,
                                                  Options.AuthenticationScheme)));
        }
Example #2
0
 public virtual Task CreatingTicket(CasCreatingTicketContext context) => OnCreatingTicket(context);