Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

[Bug] <AuthorizeView> Não está funcionando corretamente

Eu consigo fazer ele mostrar o que está dentro de Authorized, mas não o que está dentro de NotAuthorized.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Fazendo uma gambiarra para ele mostrar o forms de login se consegue ver que ele está funcionando para quendo está autorizado.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

@page "/login"
@using Microsoft.AspNetCore.Components.Authorization

@inject AuthAPI AuthAPI

<MudPaper Class="px-8 pt-2 pb-4 mx-16 my-8" Justify="Justify.Center">

    <AuthorizeView>

        <Authorized>
            <p>Você está conectado como @context.User.Identity!.Name</p>
        </Authorized>

        <NotAuthorized>
            <MudForm>

                <MudTextField T="string" Label="Email" @bind-Value="email"
                              Variant="Variant.Outlined" Class="my-4"
                              Required="true" RequiredError="Email obrigatório!"
                              OnlyValidateIfDirty="true" />

                <MudTextField T="string" Label="Senha" @bind-Value="senha"
                              InputType="InputType.Password"
                              Variant="Variant.Outlined" Class="my-4"
                              Required="true" RequiredError="Senha obrigatória!"
                              OnlyValidateIfDirty="true" />

                <MudButton Variant="Variant.Filled" Color="Color.Primary"
                           Class="my-6" @onclick="FazerLogin">
                    Login
                </MudButton>

            </MudForm>
        </NotAuthorized>

    </AuthorizeView>
    <MudForm>

                <MudTextField T="string" Label="Email" @bind-Value="email"
                              Variant="Variant.Outlined" Class="my-4"
                              Required="true" RequiredError="Email obrigatório!"
                              OnlyValidateIfDirty="true" />

                <MudTextField T="string" Label="Senha" @bind-Value="senha"
                              InputType="InputType.Password"
                              Variant="Variant.Outlined" Class="my-4"
                              Required="true" RequiredError="Senha obrigatória!"
                              OnlyValidateIfDirty="true" />

                <MudButton Variant="Variant.Filled" Color="Color.Primary"
                           Class="my-6" @onclick="FazerLogin">
                    Login
                </MudButton>

            </MudForm>
</MudPaper>

@code {
    private string? email;
    private string? senha;

    private async Task FazerLogin()
    {
        await AuthAPI.LoginAsync(email!, senha!);
    }

}

E nesse eu também não consegui colocar o botão do lado direito.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Alguém sabe resolver esse bug?

7 respostas

O estranho é que se eu removo o forms que está fora do AuthorizeView, ele também exclui o meu Cook.

Ele ainda continua dando o erro no console por conta da autorização.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
      Unhandled exception rendering component: TypeError: Failed to fetch
System.Net.Http.HttpRequestException: TypeError: Failed to fetch
 ---> TypeError: Failed to fetch
   --- End of inner exception stack trace ---
   at System.Net.Http.BrowserHttpInterop.<CancelationHelper>d__13`1[[System.Runtime.InteropServices.JavaScript.JSObject, System.Runtime.InteropServices.JavaScript, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a]].MoveNext()
   at System.Net.Http.BrowserHttpHandler.CallFetch(HttpRequestMessage request, CancellationToken cancellationToken, Nullable`1 allowAutoRedirect)
   at System.Net.Http.BrowserHttpHandler.<SendAsync>g__Impl|53_0(HttpRequestMessage request, CancellationToken cancellationToken, Nullable`1 allowAutoRedirect)
   at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at ScreenSound.Web.Services.CookieHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) in C:\Users\igort\Documents\Cursos\C#_Web_crie_aplicacoes_usando_ASP.NET\Entity\ScreenSound.Web\Services\CookieHandler.cs:line 10
   at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.<SendCoreAsync>g__Core|5_0(HttpRequestMessage request, Boolean useAsync, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   at ScreenSound.Web.Services.AuthAPI.GetAuthenticationStateAsync() in 

Olá, Igor! Como vai?

Parece que o <AuthorizeView> está funcionando para a parte de "Authorized", mas não para "NotAuthorized". Isso pode ocorrer por alguns motivos. Aqui estão algumas sugestões para resolver o problema:

  1. Verifique o Estado de Autenticação:

    • Certifique-se de que o estado de autenticação está sendo corretamente propagado. Quando o usuário não está autenticado, o método GetAuthenticationStateAsync() deve retornar um estado não autenticado.
  2. Verifique a Implementação do AuthAPI:

    • Confirme que o método VerificaAutenticado() está retornando false quando o usuário não está autenticado. Isso é crucial para que o <NotAuthorized> seja exibido corretamente.
  3. Debugging:

    • Adicione logs ou breakpoints no método GetAuthenticationStateAsync() para verificar se ele está sendo chamado corretamente e se está retornando o estado esperado.
  4. Verifique a Configuração do AuthorizeView:

    • Assegure-se de que o <AuthorizeView> está configurado corretamente no layout e que não há outros componentes ou lógica que possam estar interferindo na renderização.

Sobre o botão que não está alinhado à direita, você pode ajustar o CSS ou usar classes de utilitários para alinhar o botão conforme desejado. Por exemplo, você pode usar justify-content-end se estiver usando um sistema de grid flexbox.

Espero ter ajudado e bons estudos!

Pelo atributo autenticado, eu consegui ver que ele está voltando false, mas ele não funciona no status negativo.

No status true:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

No status false:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Segue o meu GitHub caso precise: https://github.com/IgorTudisco/Entity-Framework-Core

solução!

Bom dia Igor, tudo bom?

Analisando o seu projeto, comentei na pagina de login o trecho entre as linhas 38 e 56, pois estava diferente do proposto na aula. Debugando e analisando no navegador identifiquei que estava dando erro de CORS.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Apesar de não aparentar erro, realizei alguns ajustes no program. lá da API:

builder.Services.AddCors(options =>
    options.AddPolicy("wasm", policy =>
        policy.WithOrigins(
            [builder.Configuration["BackendUrl"] ?? "https://localhost:7122",
            builder.Configuration["FrontendUrl"] ?? "https://localhost:7199"]
        )
       .AllowAnyMethod()
       .SetIsOriginAllowed(pol => true)
       .AllowAnyHeader()
       .AllowCredentials()));

Esse daqui acho que nem precisava. kkkk

Mas a solução veio ao ajustar a ordem dos middlewares, movi o app.UseCors("wasm") e app.UseStaticFiles() para logo após o var app = builder.Build();:


var app = builder.Build();

app.UseCors("wasm");

app.UseStaticFiles();

app.UseAuthentication();
app.UseAuthorization();

Por favor replique no seu ambiente de desenvolvimento para ver se funciona corretamente agora, qualquer coisa nos pinga aqui no fórum!

Abraços!

Bom dia Professor, por aqui tudo na paz.

Mano, era só mudar a posição dos middlewares para que o AuthorizeView começasse a funcionar normalmente. kkkkk

Eu não sabia que a posição no Program.cs iria influenciar tanto.

Nem acredito que era só isso kkkkk

E realmente, restringir as rotas não era preciso, mas foi mais para aprendizado mesmo.