示例#1
0
        /// <summary>
        /// Dieser Event Handler wird aufgerufen, sobald das "POST"-Event auslöst wird (hier durch Betätigung des "Hinzufügen"-Buttons).<para>
        /// Er erstellt auf Grundlage der eingegebenen Informationen einen neuen Benutzer.</para>
        /// </summary>
        /// <returns>
        /// Ein <see cref="IActionResult"/>, das bestimmt, wie nach Behandlung des Event vorgegangen werden soll.
        /// </returns>
        public async Task <IActionResult> OnPostAsync()
        {
            OnGet();

            if (ModelState.IsValid)
            {
                IdentityUser user = new IdentityUser {
                    UserName = Input.Email, Email = Input.Email
                };
                byte[] password = new byte[32];
                RandomNumberGenerator.Fill(password);
                string         pwd    = Convert.ToBase64String(password);
                IdentityResult result = await _userManager.CreateAsync(user, pwd);

                if (result.Succeeded)
                {
                    string code = await _userManager.GeneratePasswordResetTokenAsync(user);

                    string callbackUrl = $"http://{HttpContext.Request.Host}/Identity/Account/CreatePassword?userId={user.Id}&code={Uri.EscapeDataString(code)}";

                    if (!Program.SendMail(
                            user.Email,
                            new Name(user.Email, Input.Role.Equals(Resources.Student)),
                            "Erstanmeldung",
                            "Du wurdest zur Teilnahme an der Cafeteria-Bestellsoftware (CABESO) eingeladen. Klicke {0} zur Erstanmeldung.",
                            (callbackUrl, "hier")) ||
                        !Program.MailValid(Input.Email))
                    {
                        ModelState.AddModelError(string.Empty, "Die angegebene E-Mail-Adresse konnte nicht erreicht werden.");
                        await _userManager.DeleteAsync(user);

                        return(Page());
                    }

                    await _userManager.AddToRoleAsync(user, Input.Role);

                    if (Input.Role.Equals(Resources.Student))
                    {
                        user.SetFormId(Input.FormId);
                    }

                    await _userManager.ConfirmEmailAsync(user, await _userManager.GenerateEmailConfirmationTokenAsync(user));

                    return(LocalRedirect("~/Admin/Index"));
                }

                foreach (IdentityError error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            return(Page());
        }
        /// <summary>
        /// Dieser Event Handler wird aufgerufen, sobald das "POST"-Event auslöst wird (hier durch Betätigung des "Registrieren"-Buttons).<para>
        /// Er verifiziert die Kontodaten, registriert im Erfolgsfall den neuen Benutzer und sendet eine E-Mail zur Bestätigung der E-Mail-Adresse.</para>
        /// </summary>
        /// <param name="returnUrl">
        /// Die URL, zu der nach Beendigung der Registrierung zurückgekehrt werden soll
        /// </param>
        /// <returns>
        /// Ein <see cref="IActionResult"/>, das bestimmt, wie nach Behandlung des Event vorgegangen werden soll.
        /// </returns>
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            ReturnUrl = returnUrl ?? Url.Content("~/");
            if (!Confirmed) //noch kein Registrierungscode eingegeben
            {
                return(RedirectToPage(new { code = Input.Code }));
            }

            ModelState.Remove("Input.Code");
            if (ModelState.IsValid && Input.AgbAccepted && Input.PrivacyAccepted)
            {
                IdentityUser user = new IdentityUser {
                    UserName = Input.Email, Email = Input.Email
                };
                IdentityResult result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    string callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { userId = user.Id, code = await _userManager.GenerateEmailConfirmationTokenAsync(user) },
                        protocol: Request.Scheme);

                    if (!Program.SendMail(
                            Input.Email,
                            new Name(user.Email, Role.Name.Equals(Resources.Student)),
                            "E-Mail-Adresse bestätigen",
                            "Bitte bestätige deine E-Mail-Adresse, indem du {0} klickst.",
                            (callbackUrl, "hier")) ||
                        !Program.MailValid(Input.Email))
                    {
                        ModelState.AddModelError(string.Empty, "Die angegebene E-Mail-Adresse konnte nicht erreicht werden.");
                        await _userManager.DeleteAsync(user);

                        return(Page());
                    }

                    await _userManager.AddToRoleAsync(user, Role.Name);

                    if (_userManager.Users.Count() == 1) //erster Benutzer muss Admin sein
                    {
                        await _userManager.AddToRoleAsync(user, Resources.Admin);
                    }

                    user.SetFormId(Input.FormId);
                    _context.Codes.Remove(_context.Codes.Find(_code));
                    _context.SaveChanges();

                    Program.Alert = "Bitte überprüfe dein E-Mail-Postfach und bestätige deine E-Mail-Adresse!";
                    return(LocalRedirect(ReturnUrl));
                }

                foreach (IdentityError error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            return(Page());
        }