читаю... "For server-side Blazor, it is very unlikely that you should implement a custom AuthenticationStateProvider. The built-in implementation already integrates with ASP.NET Core's built-in authentication mechanisms. If you implement a custom one, you may introduce security vulnerabilities. The only common scenario for a custom AuthenticationStateProvider is client-side Blazor, because in that case you may want to integrate with any number of external authentication systems independently of your server-side code. Also, in client-side Blazor, authentication only exists to present a convenient UI to well-behaved users - it's not actually the place where security is enforced, since client-side rules can always be bypassed." я так понимаю, что для server-side мне советуют использовать встроенный identity provider. как же быть, если я хочу аутенфицироваться на IdentityServer4 ?
Мне кажется, что тут преследуется другая мысль. Дело в том, что доля правды есть, и касается она не только blazor приложения. Встроенный механизм может легко интегрироваться с внешними провайдерами. Отсюда и рекомендации. А ещё, иожет потому что в blazor не до конца оформившийся фреймворк.
Спасибо за видео, столкнулся с проблемой: в LocalStorage данные записываются, но авторизация в CustomAuthStateProvider не проходит. Делаю под Blazor Server. В чем может быть дело?
Добрый день, на 35 минуте по видео, получаю ошибку: InvalidOperationException: JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method. Понимаю что имеется в виду, но нет понятия как исправить. Связанна ли ошибка в типе приложения, так как я пишу на Blazor Server.
@@SergeiCalabonga ошибка генерируется в строке var token = await localStorageService.GetAsync(nameof(SecurityToken));, в методе GetAuthenticationStateAsync. Майкрософт говорит: можно безопасно запустить код взаимодействия только в методе жизненного цикла OnAfterRenderAsync. Но логика работы с токеном прописана в вашем методе.
@@leonidkaruna2744 Очень тяжело в памяти компилировать код, который я не вижу Видимо, единственное, чем я смогу вам помочь - предложить консультацию он-лайн, на которой вы покажете код и мы попробуем вместе найти решение.
public override async Task GetAuthenticationStateAsync() { AuthenticationState CreateAnonymus() { var anonymusIdentity = new ClaimsIdentity(); var anonymusPrincipal = new ClaimsPrincipal(anonymusIdentity); return new AuthenticationState(anonymusPrincipal); } var token = await localStorageService.GetAsync(nameof(SecurityToken)); //если токена нет, возвращаем анонимного пользователя (не авторизованный) if (token is null) { return CreateAnonymus(); } //если содержимое токена пустое или просрочено, возвращаем анонимного пользователя (не авторизованный) if (string.IsNullOrEmpty(token.AccessToken) || token.ExpiredAt > DateTime.UtcNow) { return CreateAnonymus(); } //Claims создают для управления приложением var claims = new List { new Claim(ClaimTypes.Country,"Ukrain"), new Claim(ClaimTypes.Name,token.UserName), new Claim(ClaimTypes.Expiration,token.ExpiredAt.ToString()), new Claim(ClaimTypes.Role,"Administrator"), new Claim("Blazor","Rules"), }; //Тут доделать проверку на логин пользователя, существует ли такой и т.д. (пока без проверки) var Identity = new ClaimsIdentity(claims, "Token"); var Principal = new ClaimsPrincipal(Identity); return new AuthenticationState(Principal); }
Подскажите как получить данные из LocalStorage из Blazor Server-Side App. Сделал все как у вас в ролике и получит ошибку при обращении к LocalStarage: InvalidOperationException: JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method.
@@vitaliiwork884 Не помню, чтобы я как-то проверял. На самом деле проверяет сам Blazor и говорит, что вы что-то пытаетесь запустить из JavaScript в тот момент пока он еще не инициализирован. От того и упоминание про OnAfterRenderAsync, потому что, видимо, то что вы делаете, надо делать в этом методе.
@@SergeiCalabonga Запись в LocalStorage происходит в методе GetAuthenticationStateAsync в сервисе AuthenticationStateProvider. Это метод вызывает сам Blazor когда рендерит компонент на сколько я понял. Ну в общем я немного сколхозил и добавил конструкцию try/catch на чтение из LocalStorage. Но мне не нравится такой костыль. А как правильно сделать не знаю.
блен, 2 дня маялся с VS22 на которой у меня никак не вставал дебагер, пробовал делать урок без дебагера, чуть умом не тронулся, в итоге поставил JetBrains Rider на котором всё запстилось, и за 1,5 часа собрал всё тоже что было в ролике на aspnetcore 7
Если произношение можно простить, сославшись на изучение немецкого/французского вместо английского, то отсутвие терминологии и некоторые фразы в виде "штука", " какашки" отбивают желание досматривать до конца
Сергей, благодарю за видео.
Все структурировано и без воды.
Весьма информативно и полезно.
Приятно наблюдать за Вашей работой.
Спасибо за высокую оценку моего скромного труда. 😊
Огромное Спасибо за видео!
И вам спасибо, за то что смотрите и комментарии приятные пишете!
Большое спасибо за полезные видео!
Большое пожалуйста!
Спасибо за ролик очень полезно)
Спасибо, я старался
читаю...
"For server-side Blazor, it is very unlikely that you should implement a custom AuthenticationStateProvider. The built-in implementation already integrates with ASP.NET Core's built-in authentication mechanisms. If you implement a custom one, you may introduce security vulnerabilities.
The only common scenario for a custom AuthenticationStateProvider is client-side Blazor, because in that case you may want to integrate with any number of external authentication systems independently of your server-side code. Also, in client-side Blazor, authentication only exists to present a convenient UI to well-behaved users - it's not actually the place where security is enforced, since client-side rules can always be bypassed."
я так понимаю, что для server-side мне советуют использовать встроенный identity provider.
как же быть, если я хочу аутенфицироваться на IdentityServer4 ?
Мне кажется, что тут преследуется другая мысль. Дело в том, что доля правды есть, и касается она не только blazor приложения. Встроенный механизм может легко интегрироваться с внешними провайдерами. Отсюда и рекомендации. А ещё, иожет потому что в blazor не до конца оформившийся фреймворк.
Yes I agree the only valid claim on the client is the token itself
👍
Не рекомендовали же делать на wasme авторизацию
Всё равно придется, как и для любого другого SPA
Сергей, расскажите, пожалуйста, о расширениях в VSC, которые вы используете, а также о настройках VSC.
Что вы имеете в виду? Visual Studio Code?
@@SergeiCalabonga Да, верно. Если точнее, то имел ввиду просто Visual Studio.
@@ИгорьСтепанов-ъ7ц хорошая тема. Сделаю как-нибудь видео обзор. Спасибо.
Спасибо за видео, столкнулся с проблемой: в LocalStorage данные записываются, но авторизация в CustomAuthStateProvider не проходит. Делаю под Blazor Server. В чем может быть дело?
Спасибо за комментарий. А вот помочь с проблемой без заглядывания в код у меня вряд ли получится.
1 в 1 под Blazor Server такая же проблема
Решил ли ты год назад эту проблему ?
Добрый день, на 35 минуте по видео, получаю ошибку: InvalidOperationException: JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method.
Понимаю что имеется в виду, но нет понятия как исправить. Связанна ли ошибка в типе приложения, так как я пишу на Blazor Server.
Обращение к JsRuntime должно быть в метода OnAfterRenderAsync
@@SergeiCalabonga ошибка генерируется в строке var token = await localStorageService.GetAsync(nameof(SecurityToken));, в методе GetAuthenticationStateAsync. Майкрософт говорит: можно безопасно запустить код взаимодействия только в методе жизненного цикла OnAfterRenderAsync. Но логика работы с токеном прописана в вашем методе.
@@leonidkaruna2744 Очень тяжело в памяти компилировать код, который я не вижу
Видимо, единственное, чем я смогу вам помочь - предложить консультацию он-лайн, на которой вы покажете код и мы попробуем вместе найти решение.
@@SergeiCalabonga Хорошо, попробую объяснить. Вот сам метод целиком:
public override async Task GetAuthenticationStateAsync()
{
AuthenticationState CreateAnonymus()
{
var anonymusIdentity = new ClaimsIdentity();
var anonymusPrincipal = new ClaimsPrincipal(anonymusIdentity);
return new AuthenticationState(anonymusPrincipal);
}
var token = await localStorageService.GetAsync(nameof(SecurityToken));
//если токена нет, возвращаем анонимного пользователя (не авторизованный)
if (token is null)
{
return CreateAnonymus();
}
//если содержимое токена пустое или просрочено, возвращаем анонимного пользователя (не авторизованный)
if (string.IsNullOrEmpty(token.AccessToken) || token.ExpiredAt > DateTime.UtcNow)
{
return CreateAnonymus();
}
//Claims создают для управления приложением
var claims = new List
{
new Claim(ClaimTypes.Country,"Ukrain"),
new Claim(ClaimTypes.Name,token.UserName),
new Claim(ClaimTypes.Expiration,token.ExpiredAt.ToString()),
new Claim(ClaimTypes.Role,"Administrator"),
new Claim("Blazor","Rules"),
};
//Тут доделать проверку на логин пользователя, существует ли такой и т.д. (пока без проверки)
var Identity = new ClaimsIdentity(claims, "Token");
var Principal = new ClaimsPrincipal(Identity);
return new AuthenticationState(Principal);
}
Погодите, мы храним токен в клиенте выходит? А что мешает ему изменить expiredDate?
Измениться хэш, токен станет недействительным
@@SergeiCalabonga спасибо
Подскажите как получить данные из LocalStorage из Blazor Server-Side App. Сделал все как у вас в ролике и получит ошибку при обращении к LocalStarage:
InvalidOperationException: JavaScript interop calls cannot be issued at this time. This is because the component is being statically rendered. When prerendering is enabled, JavaScript interop calls can only be performed during the OnAfterRenderAsync lifecycle method.
Прям в тексте ошибки и есть подсказка. Обращение к localStorage можно делать в определённый момент.
@@SergeiCalabonga Каким способом вы проверяете внутри компонента на состояние PreRendering/AfterRendering?
@@vitaliiwork884 Не помню, чтобы я как-то проверял. На самом деле проверяет сам Blazor и говорит, что вы что-то пытаетесь запустить из JavaScript в тот момент пока он еще не инициализирован. От того и упоминание про OnAfterRenderAsync, потому что, видимо, то что вы делаете, надо делать в этом методе.
@@SergeiCalabonga Запись в LocalStorage происходит в методе GetAuthenticationStateAsync в сервисе AuthenticationStateProvider. Это метод вызывает сам Blazor когда рендерит компонент на сколько я понял. Ну в общем я немного сколхозил и добавил конструкцию try/catch на чтение из LocalStorage. Но мне не нравится такой костыль. А как правильно сделать не знаю.
Работает? Ничего не меняй! 🤭
На сколько я понял на 20:49 ua-cam.com/video/wPs39ZrEPQE/v-deo.html решарпером разбросан. Можно показать как рефакторинг сделать, если не сложно?
Там чисто механическая работа. Просто все классы раскидываются по файлам с таким же как класс названиями.
14:02 что за плагин?
Где?
@@SergeiCalabonga для создания файлов.
@@dannycyberwalker это не плагин, это полноценная программа Camtasia
@@SergeiCalabonga спасибо
Расширение Add New File
marketplace.visualstudio.com/items?itemName=MadsKristensen.AddNewFile
блен, 2 дня маялся с VS22 на которой у меня никак не вставал дебагер, пробовал делать урок без дебагера, чуть умом не тронулся, в итоге поставил JetBrains Rider на котором всё запстилось, и за 1,5 часа собрал всё тоже что было в ролике на aspnetcore 7
WebAssembly 😢
Кажется мне немного не повезло
Не переживайте! Это не последний раз, когда вам не повезло!
Если произношение можно простить, сославшись на изучение немецкого/французского вместо английского, то отсутвие терминологии и некоторые фразы в виде "штука", " какашки" отбивают желание досматривать до конца
Никто и не заставляет!
инстолл