Получение имени пользователя, вошедшего в систему с учетными данными домена Negotiate/Windows.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Получение имени пользователя, вошедшего в систему с учетными данными домена Negotiate/Windows.

Сообщение Anonymous »

То, что я считал очень простой задачей, оказалось противоположным.
Я создаю довольно простое веб-приложение с помощью blazor, и у меня есть Windows Аутентификация на основе учетных данных домена отлично работает с Negotiate. Это было довольно просто настроить.
Теперь предположим, что я хочу отображать сообщение типа «Добро пожаловать:» на баннере или включать имя пользователя, чтобы отслеживать отправку форм. Кажется, каждое решение, с которым я сталкивался, предлагает сделать что-то подобное непосредственно в компоненте, в котором мне нужно получить доступ к имени пользователя.
Обычно я бы просто сохранил строку имени пользователя, которая была введена в поле имени пользователя, но поскольку Negotiate использует это всплывающее окно браузера для входа в систему вместо веб-страницы, я не думаю, что это возможно. (может быть, я ошибаюсь?)
Это не мой точный код, но, по сути, это то, что я пытаюсь сделать.
Это работает в MainLayout.razor, но и в любом другом компонент внутри него вызовет исключение с нулевым значением.

Код: Выделить всё

@page "/"
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Authorization
@inject AuthenticationStateProvider AuthStateProvider
@attribute [Authorize]

 Welcome Back: @username 

@code{
public string? username;
protected override async OnInitializedAsync(){
var authstate = await AuthStateProvider.GetAuthenticationStateAsync();
username = authstate.User.Identity.Name.Substring(9);
}
}
Я думаю, проблема может заключаться в том, что компоненты Razor визуализируются дважды, из-за чего переменная authstate извлекается дважды, что приводит к ошибкам защиты от подделки, которые я продолжаю получать.
Я действительно думаю, что ключевой момент здесь заключается в том, чтобы заставить мои компоненты отображать только один раз.
Таким образом, мне нужно только получить состояние аутентификации во время входа в систему и кэшировать только то, что мне нужно от него, поэтому Я могу получить к нему доступ во всех моих компонентах, не вызывая ошибки.
Производительность меня вообще не беспокоит в этом проекте. Это очень легкое приложение, обслуживающее очень небольшое количество пользователей, поэтому я готов пожертвовать некоторой производительностью, чтобы заставить его работать.
За все время, которое я потратил на это, я вероятно, я мог бы создать свою собственную традиционную систему аутентификации и компонент входа в систему и добавить таблицу пользователей в свою базу данных.
Но мне хотелось чего-то более упрощенного для пользователей (в конечном итоге хотелось бы перейти на модель единого входа), и на данный момент , я чувствую, что я тоже в деле глубоко.
Мне кажется, что это, вероятно, намного проще, чем я это делаю. Я предполагал, что у переговоров будут встроенные методы или свойства, которые можно было бы использовать для получения имени пользователя без сбоя моего проекта, но, похоже, нет.
Я сделал несколько игр на Unity и C#. и несколько веб-сайтов с flask и js, но это мой первый настоящий проект Blazor, и я смог разобраться с большей его частью, но это полностью заблокировало меня.
Любой помощь здесь очень ценится.
Подробности проекта
  • Dotnet 8.0
  • Шаблон blazor по умолчанию
    < li>Режим интерактивного рендеринга
Я пробовал несколько разных решений, но ни одно из них не помогло.
Первое, что я попробовал, было самое простое: просто вызвать GetAuthenticationStateAsync() в метод конструктора любого компонента razor, в котором мне нужно имя пользователя. Очевидно, это не работает из-за проблемы двойного рендеринга.
Следующее, что я попробовал, — это поместить свой маршрутизатор в маршруты.razor что непоправимо испортило мой проект и заставило меня восстановить его из резервной копии. Итак, я усвоил урок, что даже смотреть на все, что содержит слово «маршрут», невозможно. Поэтому вместо этого я попытался инкапсулировать свой MainLayout.razor в блок, и хотя это не разрушило мой проект, оно все равно не работает. То же самое, когда я пытаюсь просто передать только имя пользователя из MainLayout.razor с расширением . Я обнаружил, что причина, по которой это не работает, снова заключается в том, что компоненты бритвы любят рендериться дважды. Причина, по которой я это знаю, заключается в том, что я поместил оператор Console.Writeline() в OnInitializedAsync(), который должен выводить имя пользователя на консоль отладки. Когда я загружаю страницу, я получаю не один, а ДВА оператора печати, и только первый содержит имя пользователя. Это означает, что каскадный параметр передает значение только при первом рендеринге.
Теперь мне бы хотелось изменить режим рендеринга, но InteractiveServer — единственное, что я могу поставить после @rendermode< /p>
Я подумал о добавлении службы с ограниченной областью действия, которая хранит имя пользователя в виде статической строки, но будет содержать только имя пользователя, вошедшего последним в систему.
Gemini предложила создать государственный контейнер который обновляет переменную имени пользователя каждый раз, когда происходит событие изменения состояния, но я все еще беспокоюсь, что это будет иметь тот же результат, что и сервис с ограниченной областью действия, который я уже пробовал.

Подробнее здесь: https://stackoverflow.com/questions/793 ... redentials
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»