web-dev-qa-db-fra.com

Vérification de la connexion de l'utilisateur AuthorizePolicy dans la page Razor sur Asp.Net Core

Je cherche une variante de ce

@if (SignInManager.IsSignedIn(User) && User.IsInRole(Roles.Administrator))
{
    <div id="editArticle">

mais au lieu de vérifier après le rôle, je suis après une vérification de la stratégie, comme vous le feriez dans un contrôleur.

[Authorize(Policy = Policies.RequireAdmin)]
11

Cela semble similaire à la question posée ici

J'ai trouvé ce lien qui pourrait être utile: https://docs.asp.net/fr/latest/security/authorization/views.html

Exemples de cette page:

@if (await AuthorizationService.AuthorizeAsync(User, "PolicyName"))
{
    <p>This paragraph is displayed because you fulfilled PolicyName.</p>
}

Dans certains cas, la ressource sera votre modèle d'affichage et vous pourrez appeler AuthorizeAsync exactement de la même manière que vous le feriez lors d'une autorisation basée sur une ressource.

@if (await AuthorizationService.AuthorizeAsync(User, Model, Operations.Edit))
{
    <p><a class="btn btn-default" role="button"
    href="@Url.Action("Edit", "Document", new {id= Model.Id})">Edit</a></p>
}
15
James P

Avec Dot net core 2.0 AuthorizationService.AuthorizeAsync ne retourne plus de booléen, il retourne un AuthorizationResult. Une version de travail pour Dot Net Core 2.0 ressemblera à ceci:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

@if ((await AuthorizationService.AuthorizeAsync(User, "RequireAuthenticatedUser")).Succeeded)
{
     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>
}
8
Talnaci Sergiu Vlad

Par conséquent, la vue complète contient:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

// Your HTML elements and i.e.:
@if (await AuthorizationService.AuthorizeAsync(User, "RequireAuthenticatedUser"))
{
     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>
}
4
Jesus Mostajo

Si vous comptez utiliser cela dans plusieurs vues, vous feriez mieux de mettre en œuvre un RazorPage :

public abstract class MyRazorPage<T> : RazorPage<T>
{
    public async Task<bool> HasPolicyAsync(string policyName)
    {
        var authorizationService = Context.RequestServices.GetService(typeof(IAuthorizationService)) as IAuthorizationService;
        bool isAdmin = (await authorizationService.AuthorizeAsync(User, policyName)).Succeeded;
        return isAdmin;
    }
}

puis ouvrez _ViewImports.cshtml et ajoutez l'instruction suivante:

@inherits MyRazorPage<TModel>

vous pouvez maintenant appeler HasPolicyAsync () method à partir de n’importe quelle vue:

    if (await HasPolicyAsync(Policies.RequireAdmin))
    {
        <h2>Admin is authorized</h2>
    }

Cela aurait l'air beaucoup plus concis.

0
Sergey

Pour le dire encore plus succinctement:

@inject Microsoft.AspNetCore.Authorization.IAuthorizationService authorizationService

@if (await authorizationService.AuthorizeAsync(User, null, "RequireAuthenticatedUser"))
{
     <li><a asp-area="" asp-controller="Roles" asp-action="Index">Roles</a></li>
}

Il semble que AuthorizeAsync() nécessite le paramètre resource, mais la valeur null peut être transmise comme dans mon exemple.

0
Darren