Професионална програма
Loading...
+ Нов въпрос
VenelinGrozev avatar VenelinGrozev 130 Точки

[Homework] ASP.NET Web API - User Logins

Здравейте,

Регистрирах потребител през Постман-а и го логнах след това. Когато обаче се опитам да проверя кой е логнат в момента с string currentUserId = this.User.Identity.GetUserId(); винаги получавам null. В таблицата AspNetUserLogins същевременно не се появява запис, че някой се е логнал въпреки, че при логина се връща access token.

Та въпросите ми в случая са:

- трябва ли да след логин да се появи запис в AspNetUserLogins таблицата?

- защо this.User.Identity.GetUserId(); връща null?

Тагове:
1
C# Web Services & Cloud
nikola.m.nikolov avatar nikola.m.nikolov 830 Точки

Предполагам не само аз останах изненадан, че автоматично генерирания AuthorController няма метод за стандартен login. Търсейки в google попаднах на ето тази страница в сайта на Наков. В крайна сметка разкарах всичките излишни external register-и и login-и и го направих като Наков стандартен login със sessions. За целта в базата имам отделна таблица Sessions.

2
a_rusenov avatar a_rusenov 1103 Точки

Освен ако нямаш причина, не е необходимо да персистваш токените в базата. Още повече при всеки един логин се вдига сървър в сървъра, за да извикаш истинксия сървис. 

0
Nichigo avatar Nichigo 2 Точки

Пробвай да подадеш  токена като в самата заявка - в Headers задаваш Authentication  със value: Bearer {token} .Така при мен userId-то се връща коректно , а не null.Hope it helps :)

1
VenelinGrozev avatar VenelinGrozev 130 Точки

Сега като се замисля аз Bearer-a май го слагах във формата с параметрите а не в хедъра и това може да е причината. Вечерта като се върна ще го проверя това.

0
VenelinGrozev avatar VenelinGrozev 130 Точки

Така и се оказа - Authorization-a съм давал като параметър във формата вместо в хедъра и затова не е намирало кой е логнат. Съжалявам че вдигнах излишен шум.

0
a_rusenov avatar a_rusenov 1103 Точки

В допълнение на вече казаното:

AspNetUserLogins таблицата е само за external logins (Facebook login / Twitter login и т.н.).

ASP.NET Identity моделът никъде не пази генерираните токени. При логин username, exire date, права и други неща свързани с твоята самоличност се криптират в т.н. token и той се връща на потребителя. При всяка негова заявка той го праща в хедърите с ключ Authorization и стойност Bearer {token}. От там нататък, всеки път когато някоя заявка пристигне, Web API декриптира token-а и можем да извличаме данни за потребителя през this.User.Inentity.

4
VenelinGrozev avatar VenelinGrozev 130 Точки

Благодаря, това е доста полезна информация. Честно казано аз си представях, че работи по по-различен начин.

0
thepowerof4 avatar thepowerof4 98 Точки

И аз закучих на логин функционалността. Както е споменато, няма такъв метод. Лошото е че и при регистрация не връща token и разглеждайки register метода, то наистина връща само един празен Ok(); и не логва юзъра. В базата данни се вижда, че е регистриран юзър. Въпросите ми към екипа на курса са два - как да го накараме да връща token при регистрация и как да създадем стандартен логин? Как трябва да си решим домашното, без това? Показаният от nikola.m.nikolov по-горе линк дава отговор как Наков го е направил, това ли трябва да ползваме?

P.S Не мога да го накрам да сработи - използвайки логин методите на Наков, заявката ми връща 400 Not Found - с подобреният метод. С другият това:
{
  "Message": "No HTTP resource was found that matches the request URI 'http://localhost:7151/api/Token'.",
  "MessageDetail": "No type was found that matches the controller named 'Token'."
}

Да разбирам ли че Microsoft са направили промени? VS2015.

0
20/08/2015 20:34:29
a.angelov avatar a.angelov 1317 Точки

Стандартния логин е на адрес: http://localhost:{port}/token 

Аз засега така правя логването, не съм се мъчил да го правя през регистрацията да връща тоукън...

 

Едит - няма api пред /token - затова ти връща, че нямаш такъв ресурс.

1
20/08/2015 20:38:16
thepowerof4 avatar thepowerof4 98 Точки

Бладгаря, промених препратката в метода на Наков от /api/Token на /Token и сработи. Най-накрая!

0
VenelinGrozev avatar VenelinGrozev 130 Точки

Само да допълня Анатоли, че линка за логване се конфигурира в App_Start/Startup.Auth.cs файла в реда с

TokenEndpointPath = new PathString("/Token")

Хвърли едно око на <този въпрос в stackoverflow>. Там едно индийче го е описало добре.

2
20/08/2015 20:55:39