Quantcast
Channel: ASP.NET Core
Viewing all articles
Browse latest Browse all 9386

issues faced while extend Role based authorization

$
0
0

Hello ,

i faced issues when i tried to extend role based authorization by using Microsoft identity.

when call login action method it will generate token if not added role into claim List.

   var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name,user.UserName),
                new Claim(ClaimTypes.NameIdentifier,user.Id.ToString())
            };var roles = await _userManager.GetRolesAsync(user);  // If remove this await call then it work fine.

            foreach (var role in roles)
            {
                claims.Add(new Claim(ClaimTypes.Role, role));
            }

After add new role intoClaims while generate Token and i did get any response from server for few min after some time it will shown error like below. 

Error is :  Exception has been thrown by the target of an invocation.

In Startup.cs class under ConfigureServices Method.

 services.AddDbContext<DataContext>(x => x.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
            IdentityBuilder builder = services.AddIdentityCore<User>(opt =>
            {
                opt.Password.RequireDigit = false;
                opt.Password.RequiredLength = 4;
                opt.Password.RequireNonAlphanumeric = false;
                opt.Password.RequireUppercase = false;
            });

            builder = new IdentityBuilder(builder.UserType, typeof(Role), builder.Services);
            builder.AddEntityFrameworkStores<DataContext>();
            builder.AddRoleValidator<RoleValidator<Role>>();
            builder.AddRoleManager<RoleManager<Role>>();
            builder.AddSignInManager<SignInManager<User>>();

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(auth =>
            {
                auth.TokenValidationParameters = new TokenValidationParameters()
                {
                    // ValidateIssuer = true,
                    // ValidIssuer = Configuration["AuthSettings:Issuer"],
                    // ValidateAudience = true,
                    // ValidAudience = Configuration["AuthSettings:Audience"],
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Configuration["AuthSettings:Key"])),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });   services.AddControllers(opt =>            {                var policy = new AuthorizationPolicyBuilder()           .RequireAuthenticatedUser()           .Build();                opt.Filters.Add(new AuthorizeFilter(policy));            })             .AddNewtonsoftJson(options =>              options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

In AuthController 

        [HttpPost("login")]
        public async Task<IActionResult> Login(UserForLoginDto loginDto)
        {
            var user = await _userManager.FindByNameAsync(loginDto.Username);
            var result = await _signInManager.CheckPasswordSignInAsync(user, loginDto.Password, false);
            if (result.Succeeded)
            {
                var appUsers = await _userManager.Users.Include(e => e.Photos)
                .FirstOrDefaultAsync(next => next.NormalizedUserName == loginDto.Username.ToUpper());

                var userToReturn = _mapper.Map<UserForListDto>(appUsers);
                return Ok(new
                {
                    token = GeneratejwtToken(appUsers),
                    user = userToReturn

                });
            }
            else
            {
                return Unauthorized();
            }



        }

        private async Task<string> GeneratejwtToken(User user)
        {
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name,user.UserName),
                new Claim(ClaimTypes.NameIdentifier,user.Id.ToString())
            };

            var roles = await _userManager.GetRolesAsync(user);

            foreach (var role in roles)
            {
                claims.Add(new Claim(ClaimTypes.Role, role));
            }

            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["AuthSettings:Key"]));
            var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
            var tokenDescriptor = new SecurityTokenDescriptor
            {
                Subject = new ClaimsIdentity(claims),
                Expires = DateTime.Now.AddDays(1),
                SigningCredentials = signingCredentials

            };
            var TokenHandler = new JwtSecurityTokenHandler();
            var token = TokenHandler.CreateToken(tokenDescriptor);
            return TokenHandler.WriteToken(token);
        }





Viewing all articles
Browse latest Browse all 9386

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>