Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Blazor Server : Príliš dlhý link

Aktivity
Avatar
Tadeáš Burda
Brigádník
Avatar
Tadeáš Burda :16.9.2020 14:32

Na webe generujem confirm email pomocou .NET Identyty.
Problém je že ten link je moc dlhy a keď to skúsim inde nes pri debug, tak server hodí Bad Request – Inavild URL. Na mojom stroji to ide pohode, ale keď to nahrajem na server tak to nejde.

Zkusil jsem: Napadlo mňa že proste ten token skrátim a hotovo, ale to nerieši to že nechápem kde je problém, keďže v IDE mi to ide normálne, tak prečo to nejde na severy resp. kde to mam nastaviť? Google mi moc nepomohol ohledne tohoto

Chci docílit: input pre email usera

@page "/subscribe"

@inject IAccountService account
@inject INotificationsService notifications

<section>
    <nav aria-label="breadcrumb">
        <ol class="breadcrumb">
            <li class="breadcrumb-item">
                <a href="/">
                    <i class="fas fa-home"></i>&nbsp;Domov
                </a>
            </li>
            <li class="breadcrumb-item active">
                Odber
            </li>
        </ol>
    </nav>

    <section class="p-3">
        <article>
            <p>Chceš aby sme ta <strong>informovali</strong> ak sa na našom webe udeje niečo nové?</p>
            <p>Chceš aby sme ťa <strong>pozívali</strong> na dobrovoľné brigády našich projektov?</p>
            <p>Chceš aby sme ťa <strong>upozornili</strong> na dianie vo svete a na Slovensku, o ktorom si myslíme že by onom ľudia mali vedieť?</p>
            <br />
            <div class="text-center">
                <h3>Tak potom nižšie zadaj svoj email a budeš od nás dostávať správy!</h3>
            </div>
            <br />
            <p>Tvoj email z nikým <strong>nezdieľame</strong> a odber je možné kedykoľvek <strong>zrušiť.</strong></p>
        </article>

        <EditForm Model="@model" OnValidSubmit="@OnValidSubmitAsync">
            <DataAnnotationsValidator />
            <div class="text-danger">
                <ValidationSummary />
            </div>

            <div class="form-group">
                <InputText type="email" class="form-control" @bind-Value="model.Email" placeholder="Vlož tvoj email"/>
            </div>

            <button type="submit" class="btn btn-primary">
                Odoslať
            </button>
        </EditForm>
    </section>
</section>

@code
{
    private SubscribeViewModel model = new SubscribeViewModel();

    private async Task OnValidSubmitAsync()
    {
        try
        {
            await account.RegisterAsync(model.Email);
            notifications.Add($"Na email {model.Email}, sme zaslaly overovaciu správu.", EType.primary);
        }
        catch (Exception e)
        {
            notifications.Add(e.Message, EType.danger);
        }
        finally
        {
            model = new SubscribeViewModel();
        }
    }
}

tireda čo to spracuje

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Configuration;
using Rodan.Business.Interfaces;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Encodings.Web;
using System.Threading.Tasks;

namespace Rodan.Business.Services
{
    public class AccountService : IAccountService
    {
        private readonly UserManager<IdentityUser> userManager;
        private readonly IEmailSender emailSender;
        private readonly IConfiguration configuration;
        private readonly IFileManager fileManager;

        public AccountService(UserManager<IdentityUser> userManager, IEmailSender emailSender, IConfiguration configuration, IFileManager fileManager)
        {
            this.userManager = userManager;
            this.emailSender = emailSender;
            this.configuration = configuration;
            this.fileManager = fileManager;
        }

        private string GetHtmlMessage(string email, string callbackUrl)
        {
            var keyWords = new Dictionary<string, string>
            {
                { "@date", DateTime.Now.ToString("HH:mm dd.MM.yyyy") },
                { "@email", email},
                { "@link", $"{HtmlEncoder.Default.Encode(callbackUrl)}" }
            };

            string s = fileManager.GetHtmlTemplate("confirm-email.html");
            foreach (string key in keyWords.Keys)
                s = s.Replace(key, keyWords[key]);

            return s;
        }

        private async Task SendConfirmEmailAsync(IdentityUser user)
        {
            var code = await userManager.GenerateEmailConfirmationTokenAsync(user);

            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));

            string callbackUrl = string.Format("{0}/confirm-email/{1}/{2}", configuration["Web:Url"], user.Id, code);

            await emailSender.SendEmailAsync(user.Email, "Potvrdte svoj email", GetHtmlMessage(user.Email, callbackUrl));
        }

        public async Task RegisterAsync(string email)
        {
            IdentityUser user = await userManager.FindByEmailAsync(email);

            if(user != null)
            {
                if (!user.EmailConfirmed)
                    await SendConfirmEmailAsync(user);
                else
                    throw new Exception($"{email}, už odoberá novinky na tomto webe");
            }
            else
            {
                user = new IdentityUser
                {
                    UserName = email,
                    Email = email
                };
                var result = await userManager.CreateAsync(user);

                if (result.Succeeded)
                    await SendConfirmEmailAsync(user);
            }
        }
    }
}

page na ktoru sa odkazuje confirm link

@page "/confirm-email/{UserId}/{Token}"

@inject UserManager<IdentityUser> userManager
@inject INotificationsService notifications
@inject NavigationManager navigation

@code
{
    [Parameter]
    public string UserId { get; set; }
    [Parameter]
    public string Token { get; set; }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            if (UserId == null || Token == null)
            {
                notifications.Add("Odkaz je neplatný", EType.danger);
                navigation.NavigateTo("/");
            }

            var user = await userManager.FindByIdAsync(UserId);
            if (user == null)
            {
                notifications.Add($"Používateľa s ID sa nepodarilo načítať '{UserId}'", EType.danger);
                navigation.NavigateTo("/");
            }

            Token = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(Token));
            var result = await userManager.ConfirmEmailAsync(user, Token);

            if (result.Succeeded)
                notifications.Add("Ďakujeme za potvrdenie vášho e-mailu", EType.primary);
            else
                notifications.Add("Chyba pri potvrdzovaní vášho e-mailu", EType.danger);

            navigation.NavigateTo("/");
        }
    }
}

Keby nekdo vedel pomoct pls

 
Odpovědět
16.9.2020 14:32
Avatar
don.jarducius:17.9.2020 7:53

Ahoj, dle chybové hlášky to není délkou, to by byla chyba 404.14 "URL Too Long" / 404.15 "Query String Too Long"

Tohle je ale chyba "Bad Request – Inavild URL", čili neplatný znak v URL.
Zkontroluj si, co máš přesně v URL generované v

private async Task SendConfirmEmailAsync(IdentityUser user)
        {
            var code = await userManager.GenerateEmailConfirmationTokenAsync(user);

            code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));

            string callbackUrl = string.Format("{0}/confirm-email/{1}/{2}", configuration["Web:Url"], user.Id, code);

            await emailSender.SendEmailAsync(user.Email, "Potvrdte svoj email", GetHtmlMessage(user.Email, callbackUrl));
        }

resp. co s tím provede:

private string GetHtmlMessage(string email, string callbackUrl)
        {
            var keyWords = new Dictionary<string, string>
            {
                { "@date", DateTime.Now.ToString("HH:mm dd.MM.yyyy") },
                { "@email", email},
                { "@link", $"{HtmlEncoder.Default.Encode(callbackUrl)}" }
            };

            string s = fileManager.GetHtmlTemplate("confirm-email.html");
            foreach (string key in keyWords.Keys)
                s = s.Replace(key, keyWords[key]);

            return s;
        }
Nahoru Odpovědět
17.9.2020 7:53
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Tadeáš Burda
Brigádník
Avatar
Tadeáš Burda :17.9.2020 16:00

Caw, už mi to doplo lebo sem is vyhledal co to znamena. Sedel sem zatim moc dlho uz mi to nemyslelo a ked sem zistil ze staci umazat kus teho linku a ide to tak sem predpokladal ze do je dlžku teho linku. Kazdopadne ten link vyzera takto:
https://oz-rodan.sk/…TzJ2bmxTdz09
Ja tam nevidim zadny znak ktery by byl nekorektny. A ked umazes kus steho tokenu, tak to ide. Nechapem to

 
Nahoru Odpovědět
17.9.2020 16:00
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Tadeáš Burda
don.jarducius:18.9.2020 9:19

V tom případě zde

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
18.9.2020 9:19
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na don.jarducius
Tadeáš Burda :18.9.2020 17:52

Dik, kukel sem to aj trocha googlil okolo toho ale nejde mi to.. Resp, len ta variacia kde upravujes web.config toto z registrem to je nadmoje schopnosti :-` , takze doteho sa pustat nebudu, ani nevim kde bych zacal. Kazdopadne sem dosel nato ze ak si necham vygenerovat scaffoldet pre Register a ConfirmEmail a pouzijem to(je to RazorPage) tak to funguje aj na serveri, pritem ten kod je uplne rovnaky a obydve su GET metody. Tazke trochu nechapem preco ked pouzijem BlazorPage tak to je limitovane na 260 znaku ale ked je pouziti RazorPage vtem istem rpojekte tak tam ten limit neni :-? Zatat to obejdem takto ale urcite si otem nekde este zistim lebo chcel sem pouzit Blazor abych nemusel pouzit JS ale to v RazorPages nejde. Cekal sem ze do Blazor projektu mi to bude generovat Blazor ne Razor, ale zistil sem ze aj do MVC to tak roby pre Identity. Srry trocha sem sa rozpisal :-P Kazdopadne diki za pomoc

 
Nahoru Odpovědět
18.9.2020 17:52
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.