Можно ли получить в запрошенном приложении запрошенный путь, если режим рендеринга установлен на «сервер»? - PullRequest
0 голосов
/ 18 февраля 2020

Я создал клиентское приложение Blazor, и в этом приложении у меня есть несколько политик авторизации с настраиваемыми требованиями и обработчиками. Один из них проверяет идентификатор, запрошенный в URL-адресе, и проверяет, может ли зарегистрированный пользователь просматривать этот ресурс.

Например, через клиента пользователь переходит к https://localhost/resource/1f28e41c-bc75-44d6-9eef-d46b66b649c7, который ресурс в моем API.

Я использую следующий код, чтобы увидеть путь запроса:

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

Это раньше работало, илидируемый путь действительно содержал значение «1f28e41 c» -bc75-44d6-9eef-d46b66b649c7 ”

Однако в _Host.cs html я изменил режим рендеринга с« ServerPrerendered »на« Server ». Это было связано с тем, что код выполнялся дважды в разных местах во время вызова страницы.

И так как я изменил это, значение requiredPath всегда равно "/ _blazor".

Так что мне было интересно, в приложении для блейзоров, возможно ли получить запрошенный путь, если режим рендеринга установлен на «сервер»?

1 Ответ

1 голос
/ 18 февраля 2020

Я создал клиентское приложение Blazor

Нет, вы этого не сделали. Ваше приложение представляет собой серверное приложение Blazor (также известное как серверное приложение Blazor).

Поскольку ваше приложение основано на WebSocket-соединении, а не на HTTP, вы не можете и не должны пытаться получить доступ к HttpContext. объект. HttpContext не существует в приложении на основе SignalR, таком как используемое вами приложение (Blazor Server App).

Следующий фрагмент кода создает компонент Razor с именем Profile с параметром (значением маршрута) с именем ID, который вам следует передать вашему IAuthorizationHandler

Profile.razor

@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; }

}

Примечание для запоминания: идентификатор профиля передается в ваш метод обработчика через атрибут AuthorizeView.Resource

И в методе обработчика вы можете сделать что-то вроде этого:

 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-----
        }

    }

Надеюсь, это поможет ..

...