Невозможно получить доступ к заявке JWT в токене авторизации WebApi - PullRequest
0 голосов
/ 14 ноября 2018

Мне удалось реализовать приведенное ниже решение JWT в моем MVC WebApi по следующей ссылке: Аутентификация JWT для Asp.Net Web Api

Теперь я хочу получить доступ к заявке в контроллерах, но все заявки равны нулю. Я попробовал несколько вещей, и все они возвращают ноль.

Как добавляется претензия в атрибуте JwtAuthentication:

protected Task<IPrincipal> AuthenticateJwtToken(string token)
        {
            string username;

            if (ValidateToken(token, out username))
            {
                //Getting user department to add to claim.
                eTaskEntities _db = new eTaskEntities();
                var _user = (from u in _db.tblUsers join d in _db.tblDepartments on u.DepartmentID equals d.DepartmentID select u).FirstOrDefault();
                var department = _user.DepartmentID;

                // based on username to get more information from database in order to build local identity
                var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, username),
                    new Claim(ClaimTypes.SerialNumber, department.ToString())
                    // Add more claims if needed: Roles, ...
                };

                var identity = new ClaimsIdentity(claims, "Jwt");
                IPrincipal user = new ClaimsPrincipal(identity);

                return Task.FromResult(user);
            }

            return Task.FromResult<IPrincipal>(null);
        }

То, что я пробовал до сих пор

Метод расширения для получения заявки:

public static class IPrincipleExtension
{
    public static String GetDepartment(this IIdentity principal)
    {
        var identity = HttpContext.Current.User.Identity as ClaimsIdentity;
        if (identity != null)
        {
            return identity.FindFirst("SerialNumber").Value;
        }
        else
            return null;
    }
}

Использование функции, определенной в посте (ссылка выше):

TokenManager.GetPrincipal(Request.Headers.Authorization.Parameter).FindFirst("SerialNumber")

Попытка получить доступ к претензии через поток:

((ClaimsPrincipal)System.Threading.Thread.CurrentPrincipal.Identity).FindFirst("SerialNumber")

Для всего вышеперечисленного претензия всегда равна нулю. Что я делаю не так?

1 Ответ

0 голосов
/ 28 мая 2019

Вы должны попробовать это, чтобы получить ваше требование:

if (HttpContext.User.Identity is System.Security.Claims.ClaimsIdentity identity)
{                   
    var serialNum = identity.FindFirst(System.Security.Claims.ClaimTypes.SerialNumber).Value;
}

Я резервирую identity.FindFirst("string_here").Value для того, когда я устанавливаю свои требования следующим образом:

var usersClaims = new[]
{               
    new Claim("string_here", "value_of_string", ClaimValueTypes.String),
    ...
};

вместо использования "prebuilt""значения, подобные этому:

var usersClaims = new[]
{               
    new Claim(ClaimTypes.Name, "value_of_name", ClaimValueTypes.String),
    ...
};
...