1
resposta

Authorize

bom dia

Gostaria de saber como posso incluir um [ Authorize] diretamente no Layout.cshtml. Obs: AspnetCore

Dentro da view Layout.cshtml tenho 2 menus, configurações e tabelas principais, o "admin" ve tudo, o gerente só ve o tabelas principais e o "basico" só ve o item prospect do mune tabelas principais.

@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUserModel> SignInManager
@inject UserManager<IdentityUserModel> UserManager


<ul class="navbar-nav">

    @if (SignInManager.IsSignedIn(User))
    {
        if (User.IsInRole("Administrador"))
        {

            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
                   data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                    Configurações
                </a>
                <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                    <a class="nav-link text-dark" asp-area="" asp-controller="" asp-action="">Parâmetros Gerais</a>
                    <a class="nav-link text-dark" asp-area="" asp-controller="Usuarios" asp-action="Index">Gerenciador de Usuários</a>
                </div>
            </li>
            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
                   data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                    Tabelas Principais
                </a>
                <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                    <a class="nav-link text-dark" asp-area="" asp-controller="Prospect" asp-action="Index">Prospects</a>
                    <a class="nav-link text-dark" asp-area="" asp-controller="Cliente" asp-action="Index">Cliente</a>
                </div>
            </li>
        }
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Olá @User.Identity.Name!</a>
        </li>
        <li class="nav-item">
            <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
                <button type="submit" class="nav-link btn btn-link text-dark">Sair</button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Registrar</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
        </li>
    }
</ul>

Com o autorize eu poderia dizer qual parte do código as três entidades podem visualizar e assim por diante. Usei inicialmente o User.IsInRole("Administrador") mas se eu colocar o mesmo código mudando o parâmetro em outro lugar o administrador não terá acesso.

1 resposta

Olá, tudo bem?

Para incluir a diretiva [Authorize] diretamente no arquivo Layout.cshtml no ASP.NET Core, você pode utilizar o seguinte código:

@using Microsoft.AspNetCore.Authorization

@{
    var user = Context.User;
}

<ul class="navbar-nav">
    @if (User.Identity.IsAuthenticated)
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Olá @User.Identity.Name!</a>
        </li>
        <li class="nav-item">
            <form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "Home", new { area = "" })">
                <button type="submit" class="nav-link btn btn-link text-dark">Sair</button>
            </form>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Registrar</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
        </li>
    }
</ul>

@await Html.PartialAsync("_LoginPartial")

Neste exemplo, removi a verificação de roles dentro do arquivo Layout.cshtml e adicionei a verificação de autenticação utilizando User.Identity.IsAuthenticated. Dessa forma, apenas usuários autenticados terão acesso aos menus "Olá [Nome do Usuário]" e "Sair".

Para controlar o acesso de acordo com as roles, você pode utilizar a diretiva [Authorize(Roles = "Administrador")] em cada uma das suas views, especificando a role necessária para acessá-las. Por exemplo:

[Authorize(Roles = "Administrador")]
public class ConfiguracoesController : Controller
{
    // Código do controller
}

Dessa forma, apenas usuários com a role "Administrador" terão acesso às ações deste controller.

Espero ter ajudado e bons estudos!