значение пусто при получении значения электронной почты в атрибуте авторизации - PullRequest
0 голосов
/ 03 июля 2019
[AttributeUsage(AttributeTargets.Class)]
public sealed class CustomAuthorization :  AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        HttpContextAccessor contextAccessor = new HttpContextAccessor();
        var userClaim = contextAccessor.HttpContext.User.FindFirst("Jti");
        long.TryParse(userClaim.Value, out long userId);

        var controllerInfo = filterContext.ActionDescriptor as ControllerActionDescriptor;
        CustomMemoryCacher memoryCacher = CustomMemoryCacher.CacheCreator();

        List<KullaniciYetkileriDto> yetkiler = (List<KullaniciYetkileriDto>) memoryCacher.Get(userId);

        if (filterContext != null && yetkiler != null)
        {
            filterContext.Result = new JsonResult(
                new { HttpStatusCode.Forbidden });
            filterContext.HttpContext.Response.StatusCode = 403;
        }
        else
        {
            filterContext.Result = new JsonResult(
                new { HttpStatusCode.Unauthorized });
            filterContext.HttpContext.Response.StatusCode = 401;
        }
    }
}

error userClaim null value

Я хочу получить значения идентификатора пользователя.Мне нужно получить информацию о пользователе из заявки в методе OnAuthorization.Но я получил ошибку.Где может быть проблема?

Да, я использую AddJwtBearer.Он принимает токены.Да, я использую AddJwtBearer.Он принимает токены.

                    var roles = await _userManager.GetRolesAsync(user);

                    var claims = new[]
                    {
                        new Claim(JwtRegisteredClaimNames.Sub, user.Email),
                        new Claim(JwtRegisteredClaimNames.Jti, user.Id.ToString()),
                    };

                    var claimsIdentity = new ClaimsIdentity(claims, "Token");
                    claimsIdentity.AddClaims(roles.Select(role => new Claim("roles", role)));

                    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));
                    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

                    var token = new JwtSecurityToken(_config["Tokens:Issuer"],
                    _config["Tokens:Issuer"],
                    claimsIdentity.Claims,
                    expires: DateTime.Now.AddMinutes(30),
                    signingCredentials: creds);

                    var tokenHandler = new { token = new JwtSecurityTokenHandler().WriteToken(token) };


                    //giriş yapanın birim id si cachelenir
                    var dto = new TokenModel
                    {

                        //TODO ilerde lazım olacak user propertyleri eklenecek

                        Token = tokenHandler.token,
                        UserDto = new ApplicationUserDto
                        {
                            UserName = user.UserName,
                            Email = user.Email,
                            LanguageId = user.LanguageId,
                            BirimId = enYetkiliOlduguBirim.BirimId  // default seçilen birim
                        }
                        //Mapper.Map<ApplicationUser, ApplicationUserDto>(user)
                    };

                    ResultData = dto;
                    ResultMessage = "Token created successfully";
                    StatusCode = StatusCodes.Status200OK;
                    //Giriş yapabilen kullanıcının rolleri ve rollerine ait yetkileri cachelenir

                    var cacheEntryOptions = new MemoryCacheEntryOptions()
                      .SetPriority(CacheItemPriority.Normal)
                      .SetSlidingExpiration(TimeSpan.FromDays(1));
                    CustomMemoryCacher memoryCacher = CustomMemoryCacher.CacheCreator();
                    loginCacheDto.KullaniciId = user.Id;
                    loginCacheDto.EnYetkiliOlduguBirimId = enYetkiliOlduguBirim.BirimId;
                    loginCacheDto.BirimId = enYetkiliOlduguBirim.BirimId;

                    memoryCacher.Set(user.Id, loginCacheDto, cacheEntryOptions);

                    YetkileriGetir(enYetkiliOlduguBirim.BirimId, user.Id);




                }

Часть, выдающая ошибку, выполняется в классе базовости.

public class EntityBase
{
[Display(Name = "Ols. Kullanıcı")]
    [Required(ErrorMessage = "Kullanıcı Gerekli")]
    //[MaxLength()]
    [MinLength(0)]
    public long? ApplicationUserId
    {
        get
        {
            return applicationUserId;
        }
        set
        {
            HttpContextAccessor contextAccessor = new HttpContextAccessor();
            var userClaim = contextAccessor.HttpContext.User.FindFirst("jti");
            long.TryParse(userClaim.Value, out long userId);
            applicationUserId = value ?? userId;
        }
    }

}

1 Ответ

0 голосов
/ 04 июля 2019

Хорошо работает, когда я тестирую. Тем не менее, вам нужно проверить, является ли userClaim не нулевым или User.Identity.IsAuthenticated верным во-первых. Когда код будет выполнен до того, как вы войдете в систему, он выдаст ошибку.

var userClaim = contextAccessor.HttpContext.User.FindFirst("Jti");
if(userClaim!= null)
{
    long.TryParse(userClaim.Value, out long userId);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...