/// <summary> /// Sign-in flow implementation /// </summary> /// <param name="httpContext">The HTTP Context</param> /// <param name="input">The sign-in input</param> /// <returns></returns> public async Task <SignInFlowResult> SignIn(HttpContext httpContext, SignInFlowInput input) { // gets the authorization context by the return URL (authorize callback URL) var context = await this.identityInteraction.GetAuthorizationContextAsync(input.ReturnUrl); // get the user by given email and password var validUser = await this.userService.EvaluateCredentials(input.Email, input.Password); // check if something went wrong while signin-in if (validUser.Errors.Count > 0 || validUser.Value == null) { await this.userService.SignInFailed(input.Email); throw new ShocException(validUser.Errors); } // get user from result var user = validUser.Value; // the users email is not verified report early if (!user.EmailVerified) { throw ErrorDefinition.Validation(IdentityErrors.UNVERIFIED_EMAIL).AsException(); } // do actual sign-in with given scheme await this.SignInImpl(httpContext, new SignInPrincipal { Subject = user.Id, Email = user.Email, DisplayName = validUser.Value.FullName, Provider = IdentityProviders.LOCAL, }); // the sign-in result return(new SignInFlowResult { Subject = validUser.Value.Id, ReturnUrl = input.ReturnUrl.IsBlank() || context == null ? "/" : input.ReturnUrl, ContinueFlow = context != null }); }
public Task <SignInFlowResult> SignInFlow(SignInFlowInput input) { return(this.authService.SignIn(this.HttpContext, input)); }