J'ai créé une application cliente Blazor et, dans cette application, j'ai un certain nombre de politiques d'autorisation avec des exigences et des gestionnaires personnalisés. L'un d'eux vérifie l'ID demandé dans l'URL et vérifie si l'utilisateur connecté peut visualiser cette ressource.

Par exemple, via le client, l'utilisateur accède à https://localhost/resource/1f28e41c -bc75-44d6-9eef-d46b66b649c7 qui est une ressource sur mon API.

J'utilise le code suivant pour voir le chemin de la requête :

var httpContext = _httpContextAccessor.HttpContext;
string requestedPath = httpContext.Request.Path.ToString();

Cela fonctionnait et le chemin demandé contiendrait en effet la valeur « 1f28e41c-bc75-44d6-9eef-d46b66b649c7 »

Cependant, dans le _Host.cshtml, j'ai changé le mode de rendu de "ServerPrerendered" à "Server". Cela était dû au fait que le code était exécuté deux fois à des endroits différents lors de l'appel de la page.

Et depuis que j'ai changé cela, la valeur RequestPath est toujours "/_blazor".

Je me demandais donc, dans une application blazor, est-il possible d'obtenir le chemin demandé si le mode de rendu est défini sur "serveur" ?

1
R. Cats 18 févr. 2020 à 19:17

1 réponse

Meilleure réponse

J'ai créé une application cliente Blazor

Non, tu ne l'as pas fait. Votre application est une application Blazor Server (également appelée application Blazor côté serveur).

Comme votre application est basée sur une connexion WebSocket et non sur HTTP, vous ne pouvez pas et ne devez pas essayer d'accéder à l'objet HttpContext. HttpContext n'existe pas dans une application basée sur SignalR comme celle que vous utilisez (Blazor Server App).

L'extrait de code suivant crée un composant Razor nommé Profile, avec un paramètre (valeur de route) nommé ID, que vous devez transmettre à votre IAuthorizationHandler

Profil.rasoir

@page "/profile"
@page "/profile/{id}"

 <AuthorizeView Policy="Place here the name of your policy" 
                                                Resource="@ID">
      <NotAuthorized>
        <h2 class="mt-5">You are not authorized to view this page</h2>
      </NotAuthorized>
      <Authorized>
        <div class="container my-profile">
            <h2>My Profile</h2>
            --- Place here all the content you want your user to view ----
        </div>
      </Authorized>
</AuthorizeView>

@code {

   [Parameter]
   public string ID { get; set; }

}

Remarque à retenir : l'ID de profil est transmis à votre méthode de gestionnaire via l'attribut AuthorizeView.Resource

Et dans la méthode du gestionnaire, vous pouvez faire quelque chose comme ceci :

 public Task HandleAsync(AuthorizationHandlerContext context)
    {
        if (context == null) return Task.CompletedTask;

        // get the profile id from resource, passed in from the profile page 
        // component
        var resource = context.Resource?.ToString();
        var hasParsed = int.TryParse(resource, out int profileID);
        if (hasParsed)
        {
            // compare the requested profileID to the user's actual claim of 
            // profileID
            var isAuthorized = profileID == context.User.GetProfileIDClaim();
            -- --- I can't code blindly any more-----
        }

    }

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

3
enet 18 févr. 2020 à 20:53