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); }