J'ai rencontré un tel problème. J'ai besoin d'obtenir une liste de tous les url-route à partir des pages de rasoir avec la valeur de l'attribut Authorize Tels que

@page "/counter" 
@attribute [Authorize("IsAdmin")]

J'essaie de le faire par EndpointsDataSource, mais je n'obtiens pas le bon résultat

@using Microsoft.AspNetCore.Routing 
@using Microsoft.AspNetCore.Mvc.ApplicationModels 
@using Microsoft.AspNetCore.Mvc.RazorPages 
@using Microsoft.AspNetCore.Http 
@using Microsoft.Extensions.DependencyInjection 
@using Microsoft.AspNetCore.Mvc.Routing 
@inject EndpointDataSource EndpointsDataSource

<table class="table">
    <thead class="thead-dark">
        <tr>
            <th scope="col">Order</th>
            <th scope="col">Display Name</th>
            <th scope="col">Route Pattern</th>
            <th scope="col">Metadata</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var endpoint in Endpoints)
        {
            var routeEndpoint = endpoint as RouteEndpoint;
            <tr>
                <td>@routeEndpoint?.Order</td>
                <td>@endpoint.DisplayName</td>
                <td>@routeEndpoint?.RoutePattern.RawText</td>
                <td>
                    <ul>
                        @foreach (var md in endpoint.Metadata)
                        {
                            switch (md)
                            {                               
                                case PageRouteMetadata prm:
                                    <li>
                                        <p>@nameof(PageRouteMetadata)</p>
                                        <ul>
                                            <li>Page Route: @prm.PageRoute</li>
                                            <li>Route Template: @prm.RouteTemplate</li>
                                        </ul>
                                    </li>
                                    break;
                                case PageActionDescriptor pad:
                                    <li>
                                        <p>@nameof(PageActionDescriptor)</p>
                                        <ul>
                                            <li>Id: @pad.Id</li>
                                            <li>Area: @pad.AreaName</li>
                                            <li>Display Name: @pad.DisplayName</li>
                                            <li>View Engine Path: @pad.ViewEnginePath</li>
                                            <li>Relative Path: @pad.RelativePath</li>
                                        </ul>
                                    </li>
                                    break;
                                case RouteNameMetadata rnm:
                                    <li>
                                        Route Name Metadata: @rnm.RouteName
                                    </li>
                                    break;
                                case SuppressLinkGenerationMetadata slg:
                                    <li>
                                        suppress link: @slg.SuppressLinkGeneration;
                                    </li>
                                    break;
                                default:
                                    <li>@md.ToString()</li>
                                    break;
                            }
                        }
                    </ul>
                </td>
            </tr>
        }
    </tbody>
</table>    

@code{   
    public List<Microsoft.AspNetCore.Http.Endpoint> Endpoints { get; set; }

    protected override async Task OnInitializedAsync()
    {
        Endpoints = EndpointsDataSource.Endpoints.ToList();        
    }
}

Mais je ne reçois même pas de liste d'URL de route, sans parler de la valeur de l'attribut. Est-ce que n'importe qui peut avoir des idées comment faire ceci ?

1
Anna L 24 févr. 2020 à 16:06

1 réponse

Meilleure réponse

Remplacez le code du composant Index par le code suivant et ajoutez cette directive au composant FetchData : @attribute [Authorize]

 @page "/"
 @using System.Linq;
 @using System.Reflection;


 <button type="button" @onclick="@GetRouteUrlWithAuthorizeAttribute">Get Route 
     Url With Authorize Attribute</button>

 @code{

      private Task GetRouteUrlWithAuthorizeAttribute()
      {

          // Get all the components whose base class is ComponentBase
          var components = Assembly.GetExecutingAssembly()
                                 .ExportedTypes
                                 .Where(t => 
                                t.IsSubclassOf(typeof(ComponentBase)));

          foreach (var component in components)
          {
              // Print the name (Type) of the Component
              Console.WriteLine(component.ToString());

             // Now check if this component contains the Authorize attribute
             var allAttributes = component.GetCustomAttributes(inherit: true);

             var authorizeDataAttributes = 
                             allAttributes.OfType<IAuthorizeData>().ToArray();

             // If it does, show this to us... 
             foreach (var authorizeData in authorizeDataAttributes)
             {

                Console.WriteLine(authorizeData.ToString());
             }
        }

    return Task.CompletedTask;
  }

 } 

Si vous utilisez le modèle Blazor par défaut, la sortie doit être :

XXX.App

XXX.Shared.MainLayout

XXX.Partagé.NavMenu

XXX.Pages.Erreur

XXX.Pages.Récupérer les données

Microsoft.AspNetCore.Authorization.AuthorizeAttribute

XXX.Pages.Index

J'espère que cela t'aides...

2
enet 24 févr. 2020 à 20:22