You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
usingMicrosoft.AspNetCore.WebUtilities;usingMicrosoft.Extensions.Configuration;usingMicrosoft.IdentityModel.Tokens;usingshadow.Models;usingshadow.Shared;usingSystem;usingSystem.IdentityModel.Tokens.Jwt;usingSystem.Linq;usingSystem.Security.Claims;usingSystem.Text;usingSystem.Threading.Tasks;namespaceshadow.Services{publicinterfaceIUserService{Task<UserManagerResponse>RegisterUserAsync(RegisterViewModelmodel);Task<UserManagerResponse>LoginUserAsync(LoginViewModelmodel);Task<UserManagerResponse>LogoutUserAsync(LoginViewModelmodel);Task<UserManagerResponse>ConfirmEmailAsync(stringuserId,stringtoken);Task<UserManagerResponse>ForgetPasswordAsync(stringemail);Task<UserManagerResponse>ResetPasswordAsync(ResetPasswordViewModelmodel);Task<UserManagerResponse>ChangePasswordAsync(ChangePasswordViewModelmodel);}publicclassUserService:IUserService{privateMicrosoft.AspNetCore.Identity.UserManager<ApplicationUser>_userManger;privateIConfiguration_configuration;privateIMailService_mailService;publicUserService(Microsoft.AspNetCore.Identity.UserManager<ApplicationUser>userManager,IConfigurationconfiguration,IMailServicemailService){_userManger=userManager;_configuration=configuration;_mailService=mailService;}publicasyncTask<UserManagerResponse>RegisterUserAsync(RegisterViewModelmodel){if(model==null){thrownewNullReferenceException("Reigster Model is null");}if(model.Password!=model.ConfirmPassword){returnnewUserManagerResponse{Message="Confirm password doesn't match the password",IsSuccess=false,};}varidentityUser=newApplicationUser{Email=model.Email,UserName=model.Email,About=model.About,SecondMobile=model.SecondMobile,Fullname=model.Fullname,AliasName=model.AliasName,Created=DateTime.Now,Modified=DateTime.Now};varresult=await_userManger.CreateAsync(identityUser,model.Password);if(result.Succeeded){varconfirmEmailToken=await_userManger.GenerateEmailConfirmationTokenAsync(identityUser);varencodedEmailToken=Encoding.UTF8.GetBytes(confirmEmailToken);varvalidEmailToken=WebEncoders.Base64UrlEncode(encodedEmailToken);stringurl=$"{_configuration["AppUrl"]}/api/auth/ConfirmEmail?userId={identityUser.Id}&token={validEmailToken}";await_mailService.SendEmailAsync(identityUser.Email,"Confirm your email",$"<h1>Welcome to Trustee app</h1>"+$"<p>Please confirm your email by <a href='{url}'>clicking here</a></p>");returnnewUserManagerResponse{Message="User created successfully!",IsSuccess=true,};}returnnewUserManagerResponse{Message="User did not create",IsSuccess=false,Errors=result.Errors.Select(e =>e.Description)};}/// <summary>/// Đăng nhập./// </summary>/// <param name="model"></param>/// <returns></returns>publicasyncTask<UserManagerResponse>LoginUserAsync(LoginViewModelmodel){varuser=await_userManger.FindByEmailAsync(model.Email);if(user==null){returnnewUserManagerResponse{Message="There is no user with that Email address",IsSuccess=false,};}varresult=await_userManger.CheckPasswordAsync(user,model.Password);if(!result){returnnewUserManagerResponse{Message="Invalid password",IsSuccess=false,};}varclaims=new[]{newClaim("Email",model.Email),newClaim(ClaimTypes.NameIdentifier,user.Id),};varkey=newSymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["AuthSettings:Key"]));vartoken=newJwtSecurityToken(issuer:_configuration["AuthSettings:Issuer"],audience:_configuration["AuthSettings:Audience"],claims:claims,expires:DateTime.Now.AddDays(30),signingCredentials:newSigningCredentials(key,SecurityAlgorithms.HmacSha256));stringtokenAsString=newJwtSecurityTokenHandler().WriteToken(token);returnnewUserManagerResponse{Message=tokenAsString,IsSuccess=true,ExpireDate=token.ValidTo};}// Đăng xuất.publicasyncTask<UserManagerResponse>LogoutUserAsync(LoginViewModelmodel){varuser=await_userManger.FindByEmailAsync(model.Email);if(user==null){returnnewUserManagerResponse{Message="There is no user with that Email address",IsSuccess=false,};}varresult=await_userManger.CheckPasswordAsync(user,model.Password);if(!result){returnnewUserManagerResponse{Message="Invalid password",IsSuccess=false,};}varclaims=new[]{newClaim("Email",model.Email),newClaim(ClaimTypes.NameIdentifier,user.Id),};varkey=newSymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["AuthSettings:Key"]));vartoken=newJwtSecurityToken(issuer:_configuration["AuthSettings:Issuer"],audience:_configuration["AuthSettings:Audience"],claims:claims,expires:DateTime.Now.AddDays(30),signingCredentials:newSigningCredentials(key,SecurityAlgorithms.HmacSha256));stringtokenAsString=newJwtSecurityTokenHandler().WriteToken(token);returnnewUserManagerResponse{Message=tokenAsString,IsSuccess=true,ExpireDate=token.ValidTo};}publicasyncTask<UserManagerResponse>ConfirmEmailAsync(stringuserId,stringtoken){varuser=await_userManger.FindByIdAsync(userId);if(user==null){returnnewUserManagerResponse{IsSuccess=false,Message="User not found"};}vardecodedToken=WebEncoders.Base64UrlDecode(token);stringnormalToken=Encoding.UTF8.GetString(decodedToken);varresult=await_userManger.ConfirmEmailAsync(user,normalToken);if(result.Succeeded){returnnewUserManagerResponse{Message="Email confirmed successfully!",IsSuccess=true};}returnnewUserManagerResponse{IsSuccess=false,Message="Email did not confirm",Errors=result.Errors.Select(e =>e.Description)};}publicasyncTask<UserManagerResponse>ForgetPasswordAsync(stringemail){varuser=await_userManger.FindByEmailAsync(email);if(user==null){returnnewUserManagerResponse{IsSuccess=false,Message="No user associated with email",};}vartoken=await_userManger.GeneratePasswordResetTokenAsync(user);varencodedToken=Encoding.UTF8.GetBytes(token);varvalidToken=WebEncoders.Base64UrlEncode(encodedToken);stringurl=$"{_configuration["AppUrl"]}/ResetPassword?email={email}&token={validToken}";await_mailService.SendEmailAsync(email,"Reset Password","<h1>Follow the instructions to reset your password</h1>"+$"<p>To reset your password <a href='{url}'>Click here</a></p>");returnnewUserManagerResponse{IsSuccess=true,Message="Reset password URL has been sent to the email successfully!"};}publicasyncTask<UserManagerResponse>ResetPasswordAsync(ResetPasswordViewModelmodel){varuser=await_userManger.FindByEmailAsync(model.Email);if(user==null){returnnewUserManagerResponse{IsSuccess=false,Message="No user associated with email",};}if(model.NewPassword!=model.ConfirmPassword){returnnewUserManagerResponse{IsSuccess=false,Message="Password doesn't match its confirmation",};}vardecodedToken=WebEncoders.Base64UrlDecode(model.Token);stringnormalToken=Encoding.UTF8.GetString(decodedToken);varresult=await_userManger.ResetPasswordAsync(user,normalToken,model.NewPassword);if(result.Succeeded){returnnewUserManagerResponse{Message="Password has been reset successfully!",IsSuccess=true};}returnnewUserManagerResponse{Message="Something went wrong",IsSuccess=false,Errors=result.Errors.Select(e =>e.Description)};}publicasyncTask<UserManagerResponse>ChangePasswordAsync(ChangePasswordViewModelmodel){vartokenString=model.Token;varjwtEncodedString=tokenString.Substring(7);// trim 'Bearer ' from the start since its just a prefix for the token stringvartoken=newJwtSecurityToken(jwtEncodedString:jwtEncodedString);stringemail=token.Claims.First(c =>c.Type=="Email").Value;Console.WriteLine("email => "+email);varuser=await_userManger.FindByEmailAsync(email);if(user==null){returnnewUserManagerResponse{IsSuccess=false,Message="No user associated with email",};}if(model.NewPassword!=model.ConfirmPassword){returnnewUserManagerResponse{IsSuccess=false,Message="Password doesn't match its confirmation",};}vartoken2=await_userManger.GeneratePasswordResetTokenAsync(user);varresult=await_userManger.ResetPasswordAsync(user,token2,model.NewPassword);if(result.Succeeded){returnnewUserManagerResponse{Message="Password has been changed successfully!",IsSuccess=true};}returnnewUserManagerResponse{Message="Something went wrong",IsSuccess=false,Errors=result.Errors.Select(e =>e.Description)};}}}
File appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=foo;User Id=sa; Password=SecrEt_STring;Trusted_Connection=False;MultipleActiveResultSets=True"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"AuthSettings": {
"Key": "This is the key that we will use in the encryption",
"Audience": "http://example.io",
"Issuer": "http://example.io"
},
"SendGridAPIKey": "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",
"AppUrl": "http://localhost:5002"
}
In controller
usingMicrosoft.AspNetCore.Authorization;usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.Extensions.Configuration;usingshadow.Data;usingshadow.DTO;usingshadow.Models;usingshadow.Services;usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Threading.Tasks;namespaceshadow.Controllers{[Route("[controller]")][ApiController]publicclassAssetItemController:ControllerBase{privateIUserService_userService;privateIMailService_mailService;privateIConfiguration_configuration;privateApplicationDbContext_db;publicAssetItemController(IUserServiceuserService,IMailServicemailService,IConfigurationconfiguration,ApplicationDbContextcontext/*, SignInManager<IdentityUser> signInManager */){_userService=userService;_mailService=mailService;_configuration=configuration;_db=context;// _signInManager = signInManager;}// Admin liệt kê tất cả các tài sản.[HttpGet][Route("all")][Authorize(Roles="ADMIN")]publicasyncTask<ActionResult<AssetItem>>GetAllAssetItems(){vara=awaitTask.Run(()=>_db.AssetItems);if(a!=null){returnOk(a.ToList());}else{returnNoContent();}}// Liệt kê tất cả các tài sản theo user_id.[HttpGet][Route("user/{userId}")]publicasyncTask<ActionResult<IEnumerable<AssetItem>>>GetAllAssetItemsByUserId(stringuserId){varassetListByUserId=awaitTask.Run(()=>_db.AssetItems.Where(x =>x.UserId==userId).ToList());if(assetListByUserId!=null){returnOk(assetListByUserId);}else{returnNoContent();}}// Xem chi tiet asset_item theo id cua no.[HttpGet][Route("{assetItemId}")]publicasyncTask<ActionResult<IEnumerable<AssetItem>>>ViewAssetItemById(intassetItemId){varassetListByUserId=awaitTask.Run(()=>_db.AssetItems.Where(x =>x.Id==assetItemId).FirstOrDefault());if(assetListByUserId!=null){returnOk(assetListByUserId);}else{returnNoContent();}}// Xóa tài sản.[HttpDelete("{id}")]publicasyncTask<ActionResult<string>>DeleteAssetItem(intid){varitem=_db.AssetItems.Find(id);if(item!=null){_db.AssetItems.Remove(item);await_db.SaveChangesAsync();returnOk("ok");}else{returnNotFound();}}// POST http://localhost:5002/AssetItem[HttpPost][ProducesResponseType(StatusCodes.Status200OK)][ProducesResponseType(typeof(string),StatusCodes.Status400BadRequest)][Authorize]publicasyncTask<ActionResult<AssetItem>>Add([FromForm]AssetItemDTOinput){if(ModelState.IsValid){AssetItemassetItem=newAssetItem();if(input.AssetTypeId!=null){assetItem.AssetTypeId=input.AssetTypeId;}if(input.UserId!=null){assetItem.UserId=input.UserId;}if(input.TrustedPersonId!=null){assetItem.TrustedPersonId=input.TrustedPersonId;}if(input.TrustedContent!=null){assetItem.TrustedContent=input.TrustedContent;}if(input.Description!=null){assetItem.Description=input.Description;}assetItem.Created=DateTime.Now;if(input.file!=null){if(IsImageFile(input.file)){stringimgPath=awaitWriteFile(input.file);assetItem.ImagePath=imgPath;}else{returnBadRequest(new{message="Invalid file extension"});}}_db.AssetItems.Add(assetItem);await_db.SaveChangesAsync();returnOk(assetItem);}else{returnBadRequest(ModelState);}}// Edit 1 tài sản.// PUT http://localhost:5002/AssetItem[HttpPut("{id}")][ProducesResponseType(StatusCodes.Status200OK)][ProducesResponseType(typeof(string),StatusCodes.Status400BadRequest)][Authorize]publicasyncTask<ActionResult<AssetItem>>Edit([FromForm]AssetItemDTOinput,intid){if(ModelState.IsValid){varfoo=_db.AssetItems.Find(id);if(!String.IsNullOrEmpty(input.TrustedContent)){foo.TrustedContent=input.TrustedContent;}else{foo.TrustedContent=null;}if(input.file!=null){stringimgPath=awaitWriteFile(input.file);foo.ImagePath=imgPath;}else{foo.ImagePath=null;}if(!String.IsNullOrEmpty(input.Description)){foo.Description=input.Description;}else{foo.Description=null;}foo.AssetTypeId=input.AssetTypeId;if(input.TrustedPersonId!=null){foo.TrustedPersonId=input.TrustedPersonId;}// Hiện chưa ghi nhận user_modified. Cần xem lại Requirement.if(!String.IsNullOrEmpty(input.UserModified)){foo.UserModified=input.UserModified;}else{foo.UserModified=null;}foo.Modified=DateTime.Now;_db.Update(foo);await_db.SaveChangesAsync();returnOk(foo);}else{returnBadRequest(ModelState);}}privateboolIsImageFile(IFormFilefile){try{varextension="."+file.FileName.Split('.')[file.FileName.Split('.').Length-1];return(extension==".png"||extension==".jpg"||extension==".bmp"||extension==".gif"||extension==".tif");}catch{returnfalse;}}privateasyncTask<string>WriteFile(IFormFilefile){stringfileName="";try{varextension="."+file.FileName.Split('.')[file.FileName.Split('.').Length-1];fileName=DateTime.Now.Ticks+extension;//Create a new Name for the file due to security reasons.varpathBuilt=Path.Combine(Directory.GetCurrentDirectory(),"Upload\\file");if(!Directory.Exists(pathBuilt)){Directory.CreateDirectory(pathBuilt);}varpath=Path.Combine(Directory.GetCurrentDirectory(),"Upload\\files",fileName);using(varstream=newFileStream(path,FileMode.Create)){awaitfile.CopyToAsync(stream);}returnfileName;}catch(Exceptione){//}returnfileName;}}}
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
My question has bounty https://stackoverflow.com/questions/64062047/asp-net-core-identity-authorizeroles-admin-not-work
I am using .NET version
5.0.100-rc.1.20452.10
, ASP.NET Core Web API, Microsoft SQL Server 2019, JWT token. I haveStartup.cs
File
IUserService.cs
File
appsettings.json
In controller
Database
result
When add
[Authorize(Roles ="ADMIN")]
, it shows 403 Forbidden .How to make Authorize by Role work?
Beta Was this translation helpful? Give feedback.
All reactions