Форум программистов, компьютерный форум, киберфорум
Web API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/76: Рейтинг темы: голосов - 76, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 9

ASP.NET Web API своя авторизация

01.09.2017, 14:21. Показов 15765. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Интересует следующее. Есть готовая база данных с таблицей пользователей. Есть ли возможность, использовать эту таблицу для авторизации пользователей? Искал в интернете, везде предлагают использовать Individual Accounts, но в этом случае будут созданы таблицы самим ASP. А так как база уже в продакшене, этого не хотелось бы, а хотелось бы использовать свою таблицу.

Вообще, идя проекта такова:
есть страница, на которой пользователи смогу вводить цены товаров в магазинах (необходимо для статистики). Веб сервер с самой страницей будет находиться отдельно от севера SQL, это раз, а второе, он будет в DMZ зоне. Вот тут я и задумался, как лучше реализовать получение данных из базы. Сначала была идя писать WCF сервис, который сможет запрашивать данные от базы, а результат отображать на странице. И все изминения в базу писать через сервис. Вроде не сложно, но тоже не смог разобраться, как сделать авторизацию пользователей. До этого делал страницы для внутренней сети, в которой использовалась Windows Auth и небыло разграничений прав на странице. Как это реализовать в вебе пока не знаю.
С WCF не понятен один момент, как к нему оброщаться из ASP. (Пока были идея использовать HttpClient)
Если не сложно, то может натолкнете на идеи? Хотя бы в какю сторону смотреть!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.09.2017, 14:21
Ответы с готовыми решениями:

ASP.NET .NET Core Web Api -- почему параметры всегда null?
Что я делаю не так? using Microsoft.AspNetCore.Mvc; namespace WebApiServer.Controllers { ")] public class...

Установка Angular 2.3 на ASP .Net Core Web Api
В интернете куча примеров установки ангуляра, но старых версий. Они не подходят для установки с Ангуляром 2.3.0. Я проект на ангуляре...

Asp.net web api 2 обработка параметра как в MVC
Привет. Приходит такая строка из вне (форма). Для сути проблемы сократил лишние параметры Первый запрос , все отлично как надо. ...

20
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
04.09.2017, 10:20
Полез я сейчас в изучение Angular 2 и делаю тестовый проект с авторизацией через WebApi.

Со стороны сервера все очень просто, проще подключить Identity, чем городить костыли. А в Вашем случае можно еще проще, работать не с Identity в проекте с Individual Accounts, а с авторизацией на основе куки.

вот сцылко: Тынц

С Identity станет проблема с запросами WebApi, в частности с токенами. Ну, даже если это не такая и большая проблема, то я сейчас ее решаю.
1
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
04.09.2017, 12:01
Если задача только в аутентификации, то используйте соответствующий фильтр. Городить огород с Identity или велосипедами не нужно.
1
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 9
05.09.2017, 08:43  [ТС]
Вам спасибо за ответы! Буду смотреть и куки и Identity.

А что лучше использовать, WebAPI или на сервере поднимать WCF сервис и к нему обращаться с сайта? Я так понял, что WebAPI удобен когда кросплатформенные клиенты. У меня точно будет только WEB, так что может мне WebApi и не нужен вовсе?
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
05.09.2017, 10:19
Что лучше знаешь - то и делаешь.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
07.09.2017, 12:21
laviritel, Используйте систему авторизации Identity - специально для этого и создана.

Цитата Сообщение от freeba Посмотреть сообщение
Городить огород с Identity или велосипедами не нужно.
С велосипедами не нужно. Identity то тут причем?
Цитата Сообщение от freeba Посмотреть сообщение
Если задача только в аутентификации, то используйте соответствующий фильтр.
Урезанное решение и по сути является велосипедом. Зачем пилить самому, когда есть готовая система авторизации?
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
07.09.2017, 13:21
Цитата Сообщение от cyb0rg_01 Посмотреть сообщение
Используйте систему авторизации Identity - специально для этого и создана.
Сомнительное утверждение, учитывая что она без костылей с webapi не работает )))
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
07.09.2017, 13:26
Цитата Сообщение от freeba Посмотреть сообщение
учитывая что она без костылей с webapi не работает
Кто сказал такую гадость?

freeba, Работает и очень даже прекрасно. Просто нужно уметь пользоваться.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
07.09.2017, 14:05
Цитата Сообщение от cyb0rg_01 Посмотреть сообщение
Работает и очень даже прекрасно. Просто нужно уметь пользоваться.
А я не говорю что не работает. Только с десятком классов прокладок между webapi и Identity. А фильтр это один класс, причем преимуществ нет никаких, тот же OAuth к апи не прикрутишь, а для безопасности никто не мешает использовать стандартный обвес asp.net.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
07.09.2017, 14:44
Цитата Сообщение от freeba Посмотреть сообщение
А я не говорю что не работает. Только с десятком классов прокладок между webapi и Identity.
4 класса, так например:

C#
1
2
3
4
5
6
7
8
//по дефолту - пустые (если необходимо добавить что-то, то добавляются поля и миграции соответсвенно), все поля дергаются из базового класса. простейшие классы, их можно даже в счет не брать.
 
public class ApplicationUser : IdentityUser
    {
    }
public class ApplicationRole : IdentityRole
    {
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
//здесь тоже все по дефолту, но нужно связать систему с нужно БД (что делается в одну строчку)
public class ApplicationRoleManager : RoleManager<ApplicationRole>
    {
        public ApplicationRoleManager(RoleStore<ApplicationRole> store)
            : base(store)
        { }
        public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
        {
            //связываем систему с базой данных
            return new ApplicationRoleManager(new
                    RoleStore<ApplicationRole>(context.Get<DBEntities>()));
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    //здесь тоже все по дефолту, но нужно связать систему с нужно БД (что делается в одну строчку)
    public class ApplicationUserManager : UserManager<ApplicationUser>
    {
        public ApplicationUserManager(IUserStore<ApplicationUser> store)
            : base(store)
        {
        }
 
        public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
        {
            //связываем систему с базой данных
            var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<DBEntities>()));
            // Настройка логики проверки имен пользователей
            manager.UserValidator = new UserValidator<ApplicationUser>(manager)
            {
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            };
 
            // Настройка логики проверки паролей
            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 6,
                RequireNonLetterOrDigit = false,
                RequireDigit = false,
                RequireLowercase = false,
                RequireUppercase = false,
            };
 
            return manager;
        }
    }
В Startup.cs нужно добавить пару строчек и можно использовать нормальную систему авторизации, а не урезанный велосипед. Думаю учить как пользоваться ей не нужно.

C#
1
2
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
Добавлено через 1 минуту
Цитата Сообщение от freeba Посмотреть сообщение
Сомнительное утверждение, учитывая что она без костылей с webapi не работает )))
И где же костыли? У меня решение выше работает отлично.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
07.09.2017, 15:23
Цитата Сообщение от cyb0rg_01 Посмотреть сообщение
И где же костыли? У меня решение выше работает отлично.
Сразу видно вы не писали сколь нибудь нагруженные апи)) С пиком хотя бы на 50-100 запросов/сек. А теперь перепишите ваше решение в мультипроцессном стиле, как и должно быть апи (если оно хочет называться масштабируемым, конечно).
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
07.09.2017, 16:01
Цитата Сообщение от freeba Посмотреть сообщение
Сразу видно вы не писали сколь нибудь нагруженные апи
Вы этот вывод сделали на основе того, что я не использовал асинхронные операции в коде выше? Больше похоже на провокацию, т.к. вам больше ответить нечем.

То что я написал выше - стандартное решение от microsoft, используемое по-умолчанию в ASP.NET MVC 5 проектах, которое годится и для WEB API 2 проектов. В стандартном решении так же есть асинхронные ф-ции, которые я не посчитал нужным показывать в примере, чтобы было меньше кода.

Цитата Сообщение от freeba Посмотреть сообщение
Сомнительное утверждение, учитывая что она без костылей с webapi не работает )))
Где костыль-то? Если не разбираетесь в вопросе не нужно идти на провокации.

Цитата Сообщение от freeba Посмотреть сообщение
Только с десятком классов прокладок между webapi и Identity.
Сразу видно, что вы вообще Identity в глаза не видели

Добавлено через 12 минут
Цитата Сообщение от cyb0rg_01 Посмотреть сообщение
Думаю учить как пользоваться ей не нужно.
Все же опишу метод вызываемый в методах действий WEB API2:


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public async Task<IdentityResult> CreateAsync(RegisterModel model)
        {
            try
            {
                ApplicationUser user = Mapper.Map<ApplicationUser>(model);
                var result = await Database.ApplicationUserManager.CreateAsync(user, model.Password);
                return result;
            }
            catch (Exception e)
            {
                return new IdentityResult(new [] {"Database error"});
            }
        }
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
07.09.2017, 22:18
cyb0rg_01,
Цитата Сообщение от cyb0rg_01 Посмотреть сообщение
Вы этот вывод сделали на основе того, что я не использовал асинхронные операции в коде выше? Больше похоже на провокацию, т.к. вам больше ответить нечем.
Асинхронные операции тут совсем не при чем. Вы даже не поняли о чем я говорил. Попробую объяснить.

Апи добавляют когда требуется предоставить интерфейс для взаимодействия внешним системам. Люди не работают с апи, с апи работают программы - это накладывает некоторые обязательства на реализацию (если, конечно, речь не идет о хоумпаге или интернет магазине с двумя посещениями в сутки), в частности речь идет о масштабировании и эффективном использовании ресурсов.

Тот пример что вы привели - калька с обычного ASP.NET MVC и там он будет работать (чуть-чуть допилить SessionStateProvider и система сможет работать в любом количестве воркеров на любом количестве серверов), но он слабо годится для WebApi.

Дело в том что даже на мощном сервере с многогигабитным каналом если мы ограничим максимальное число рабочих процессов в пуле IIS одной штукой - то даже при небольшой бомбардировке запросами наше апи начнет впадать в летаргию, хотя нагрузка на сервер будет ничтожна. Поэтому обычно количество рабочих процессов (воркеров) устанавливают в количество ядер процессора плюс один. И в каждом из этих воркеров будет исполнятся экземпляр нашего апи, вроде все хорошо, но эти процессы ничего не знают друг о друге и если юзер авторизовался в одном из них, то другие воркеры об этом ни сном ни духом, а балансеру без разницы в какой воркер отправлять запрос - с его точки зрения они все одинаковы. Вот здесь на сцену и выходит махровое костылестроение.

Поэтому никто в здравом уме и не использует Identity вместе с WebApi, не дружат они, хотя при желании и их можно поженить, насильно так сказать.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
07.09.2017, 23:54
Цитата Сообщение от freeba Посмотреть сообщение
Поэтому никто в здравом уме и не использует Identity вместе с WebApi, не дружат они, хотя при желании и их можно поженить, насильно так сказать.
Кроме майкрософта:

https://docs.microsoft.com/en-... in-web-api
https://blogs.msdn.microsoft.c... authorize/
http://bitoftech.net/2014/06/0... -identity/


Цитата Сообщение от freeba Посмотреть сообщение
Асинхронные операции тут совсем не при чем. Вы даже не поняли о чем я говорил. Попробую объяснить.
Потому, что других причин для этого не увидел.

freeba, совсем не понял ваш ответ и каким образом Identity грузит запросы вообще непонятно:

и приведите пример вот этого, какие еще десятки классов. Что-то сомневаюсь сильно
Цитата Сообщение от freeba Посмотреть сообщение
Сомнительное утверждение, учитывая что она без костылей с webapi не работает )))
Цитата Сообщение от freeba Посмотреть сообщение
Только с десятком классов прокладок между webapi и Identity.
Работает без костылей - это 100%. Без 10-ков классов - не видел ваших примеров. То что вы пишете про масштабируемость и связанные с этим проблемы - скорее всего проблема вашего костыльного отношения к identity, не более

WebAPI существует на уровне ASP.NET MVC5 приложения. Я Всегда использовал решение от microsoft по-умолчанию, которое работает отлично. То что пишете вы требует подтверждения.
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
08.09.2017, 02:16
cyb0rg_01, Вы даже не захотели понять о чем вам говорят и снова тыкаете примеры реализации не пригодные к использованию вне одного процесса. Если когда нибудь просветление вас настигнет, почитайте про вебфермы и особенности адаптации систем к ним - может тогда дойдет для чего Identity подходит, а к чему его придется молотком прибивать.

Вобще тратить время что-то вам доказывая у меня желания нет. Нравится вертеться в кругу заблуждений - дело ваше.
0
Фрилансер
735 / 352 / 96
Регистрация: 05.05.2014
Сообщений: 2,621
08.09.2017, 09:21
Цитата Сообщение от freeba Посмотреть сообщение
Вобще тратить время что-то вам доказывая у меня желания нет. Нравится вертеться в кругу заблуждений - дело ваше.
Потому что разумных утверждений не было. Только у вас мифическая, никому неизвестная проблема, которая решается костылестроением, опять же только у вас.

Цитата Сообщение от freeba Посмотреть сообщение
Вобще тратить время что-то вам доказывая у меня желания нет. Нравится вертеться в кругу заблуждений - дело ваше.
Ни одного источника на данную проблему. Сами-то Identity хоть раз использовали?

Цитата Сообщение от freeba Посмотреть сообщение
Тот пример что вы привели - калька с обычного ASP.NET MVC и там он будет работать (чуть-чуть допилить SessionStateProvider и система сможет работать в любом количестве воркеров на любом количестве серверов), но он слабо годится для WebApi.
WebAPI существует на уровне ASP.NET приложения. Система авторизации Identity работает на уровне ASP.NET приложения.

Цитата Сообщение от freeba Посмотреть сообщение
и если юзер авторизовался в одном из них, то другие воркеры об этом ни сном ни духом, а балансеру без разницы в какой воркер отправлять запрос - с его точки зрения они все одинаковы.
Авторизация происходит при каждом запросе (при каждом запросе!!!) даже в случае использования одного веб-сервера, причем здесь могут быть вообще рабочие процессы? Для каждого запроса балансировщик нагрузки (в случае использования ARR) просто циклически перебирает веб-сервер (рабочий процесс) из фермы для отправки этого запроса. Если пользователь аутентифицирован, то каждый рабочий процесс об этом знает, и в случае же авторизации через методы действий WebAPI, вся работа лежит только на фильтре [Authorize] и не более - это тоже самое, что используете вы, только реализованное системой Identity и для авторизации:
Цитата Сообщение от freeba Посмотреть сообщение
Если задача только в аутентификации, то используйте соответствующий фильтр.
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
08.09.2017, 09:31
Вставлю свои 5 копеек.
Если в Identity есть такая проблема с высоконагруженными приложениями, то что мешает в том же Identity использовать JWT. Причем там стандартная поддержка, а любой процесс любого ядра любого пула, получив запрос от приложения сначала проведет авторизацию по токену, а потом уже выполнит метод контроллера WebApi. И никаких костылей не надо.

Правда надо немного допилить WebApi, чтобы он при авторизации передавал токен в приложение, но это не костыль
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
15.09.2017, 15:53
Кстати, раз зашла такая пьянка, то надо послушать совета более умных товарищей.

Ситуация такая, связанная как-раз с авторизацией веб-приложения через WebApi ASP.NET Core 2.0
Начал разбираться с этим чудом в связке с Angular 2. В шаблонах VS приложение Angular 2 идет в связке с WebApi, но там нет авторизации. Решил прикрутить ручками. В примере была авторизация по JWT, соответственно авторизационных куков нету. Передается токен. В Identity авторизация проходит через куки. Но все-равно прикрутил Identity
В Core 2.0 в области авторизации есть существенные изменения, так в файле startup.cs в методе Configure вызов:
C#
1
app.UseIdentity();
уже не прокатывает. Надо использовать app.UseAuthentication();

Если не использовать SingnInManager для авторизации, но оставить все остальное из Identity для работы с юзверями, то все работает. Сервис авторизации по JWT работает, токен передается в приложение, из приложения он же возвращается в Headers
[Authorize] работает.
Вот и интересует меня вопрос - такая реализация это костыль, али нет?
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
15.09.2017, 17:57
Не увидел, чем вам не угодил Jwt?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
services.AddIdentity<User, IdentityRole>(options =>
{
    options.User = new UserOptions
    {
        RequireUniqueEmail = true,
        //AllowedUserNameCharacters = "допустимые символы"
    };
 
    options.Password = new PasswordOptions
        {
            RequireDigit = true,
            RequireNonAlphanumeric = false,
            RequireUppercase = false,
            RequireLowercase = true,
            RequiredLength = 5,
        };
    })
    .AddEntityFrameworkStores<ApplicationContext>();
 
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(cfg =>
    {
        cfg.RequireHttpsMetadata = false;
        cfg.SaveToken = true;
 
        cfg.TokenValidationParameters = new TokenValidationParameters()
        {
            //ValidateIssuerSigningKey = true,
            //ValidateIssuer = true,
            ValidateLifetime = true,
 
            ValidIssuer = "",
            ValidAudience = "",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("KEYKEYKEY!"))
        };
    });
Потом всё тоже повторяем при авторизации:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// POST api/auth/login
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody]LoginViewModel model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
 
    var user = await _userManager.FindByNameAsync(model.Email);
    if (user == null ||
        !await _userManager.CheckPasswordAsync(user, model.Password))
    {
        return Unauthorized();
    }
 
    var claims = await GetValidClaims(user);
 
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("KEYKEYKEY"));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
 
    var expires_in = 10 * 60;
 
    var token = new JwtSecurityToken("УДАЛИЛ",
        "УДАЛИЛ",
        claims,
        expires: DateTime.Now.AddSeconds(expires_in),
        signingCredentials: creds);
 
    return Ok(new
    {
        id = user.Id,
        user_name = user.UserName,
        auth_token = new JwtSecurityTokenHandler().WriteToken(token),
        expires_in = expires_in
    });
}
 
private async Task<List<Claim>> GetValidClaims(User user)
{
    IdentityOptions options = new IdentityOptions();
    var claims = new List<Claim>
    {
        new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
        new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
        new Claim(options.ClaimsIdentity.UserIdClaimType, user.Id.ToString()),
        new Claim(options.ClaimsIdentity.UserNameClaimType, user.UserName)
    };
 
    var userClaims = await _userManager.GetClaimsAsync(user);
    var userRoles = await _userManager.GetRolesAsync(user);
    claims.AddRange(userClaims);
    foreach (var userRole in userRoles)
    {
        claims.Add(new Claim(ClaimTypes.Role, userRole));
        var role = await _roleManager.FindByNameAsync(userRole);
        if (role != null)
        {
            var roleClaims = await _roleManager.GetClaimsAsync(role);
            foreach (Claim roleClaim in roleClaims)
            {
                claims.Add(roleClaim);
            }
        }
    }
 
    return claims;
}
Частично сократил, но код понятен, я думаю.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
login(email: string, password: string) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/json');
 
    return this.http
        .post(
        this.baseUrl + 'api/accounts/login',
        JSON.stringify({ email, password }), { headers }
        )
        .map(res => res.json())
        .map(res => {
            localStorage.setItem('auth_token', res.auth_token);
            UserService._authNavStatusSource.next(true);
 
            return true;
        })
        .catch(this.handleError);
}
 
logout() {
    localStorage.removeItem('auth_token');
    UserService._authNavStatusSource.next(false);
}
И далее, там где нужна авторизация, клеим в шапку токен:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    private getHeaders(): Headers {
        let headers = new Headers();
        let authToken = localStorage.getItem('auth_token');
        headers.append('Authorization', `Bearer ${authToken}`);
 
        return headers;
    }
 
    private getGroupInfo(): void {
    let headers = this.getHeaders();
    let getVk: GetVk =  {
        vkGroupId: this.vkGroupId,
        sc: this.sc
    };
 
    headers.append('Content-Type', 'application/json;charset=utf-8');
    let options = new RequestOptions({ headers: headers });
 
    this.http.post(
        this.baseUrl + 'api/group/get-vk-post',
        JSON.stringify(getVk), options)
        .subscribe(result => {
            this.result = result.json();
            this.sc++;
        }, error => console.error(error));
}
Лучше, конечно - прописать отдельный отдельный сервис, и использовать через providers

Добавлено через 1 минуту
Все ключи можно прописать в appsettings.json и использовать через Configuration.

Добавлено через 4 минуты
Можно юзать 2 вида авторизации и Default и JWT, но тогда, в нужно будет всего навсего указать -- какой способ авторизации использовать контролом/методом.
C#
1
2
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Roles = "admin")]
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
16.09.2017, 12:13
Не, мне лично он всем угодил. У меня сделано все так же как и тут. Меня смутило только, что а не костылестроением называется архитектура где AddIdentity и AddAuthentication в одном флаконе?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2017, 12:13
Помогаю со студенческими работами здесь

ASP.NET Core + Web API. Как работает эта магия?
Собственно, чешу репу. Положил перед собой книгу Фримена, открыт сайт metanit, в закладках лежит харб. У всех трех источников логика подачи...

ASP.NET Core Web API - не приходят данные [FromBody] Post/Put запросов
Всем привет! Столкнулся в ASP.NET Core Web API с ситуацией, когда в Action не приходят данные запроса (со строки все нормально). ...

ASP.NET Core Web API - Content negotiation - Error 5000 при отправке XML
Здравствуйте, уважаемые господа! Решил реализовать в своем веб-приложении Content Negotiation. По-умолчанию клиенту возвращается...

.Net Core Web Api и Angular 2
Backend - .Net Core Web Api Frontend- Angular 2. Подскажите пожалуйста как реализовать подключение БД MS SQL Server, и где прописывать...

Способы развёртывания ASP.NET Core API
Доброе утро! Каковы различия между различными способами развёртывания этого API на Windows Server в плане частоты перезапусков не по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru