ฉันต้องการสกัดกั้นคำขอเว็บแต่ละรายการที่มาถึง API ในระหว่างคำขอแต่ละรายการฉันต้องการเรียกใช้ฟังก์ชันที่ฉันเขียนซึ่งจะบอกฉันว่าผู้ใช้มีรหัสลิขสิทธิ์ที่ถูกต้องไม่หมดอายุ สองสามสิ่งที่ฉันจะต้องมีคือสิ่งหนึ่งที่สามารถระบุผู้ใช้ได้ ฉันสามารถทำได้โดยการแกะโทเค็น JWT ฉันจะต้องเข้าถึงโทเค็นนั้น นอกจากนี้ ฉันจะต้องสามารถเรียกวิธีการจากคลาสใดคลาสหนึ่งของฉันได้ ซึ่งก็คือ ลงทะเบียนสำหรับการฉีดโดยใช้ autofac แล้ว ฉันรู้ว่ามีตัวกรองการดำเนินการและมิดเดิลแวร์ที่ฉันสามารถเชื่อมโยงได้ แต่ฉันไม่ค่อยมีประสบการณ์ในการใช้สิ่งใดสิ่งหนึ่งเหล่านี้ ฉันกำลังมองหาวิธีที่ดีที่สุดในการทำเช่นนี้บางทีอาจชี้ให้ฉันดูตัวอย่างด้วย โอ้และฉันจะต้องรู้เส้นทางด้วย มีวิธี API สองสามวิธีที่ได้รับการยกเว้นจากการตรวจสอบนี้ หากเช็ครู้สึกว่าฉันต้องการส่งคำขออย่างชัดเจน อาจส่งข้อผิดพลาด 401 หรืออะไรสักอย่าง
การอนุญาตที่กำหนดเองใน Asp.net core 2.1 web api
คำตอบ (1)
ฉันขอแนะนำหลักสูตร Udemy ของ Neil Cummings เป็นอย่างยิ่ง สร้างแอปด้วย ASPNET Core และ Angular From Scratch
โซลูชันตัวอย่าง มีใบอนุญาต MIT
หลักสูตร 28 ชั่วโมงและโซลูชันที่เกี่ยวข้องนี้ใช้:
- โทเค็น JWT และ Microsoft.AspNetCore.Identity สำหรับการตรวจสอบสิทธิ์
- IAsyncActionFilter to:
- intercept web requests
- อ่านการเรียกร้องของผู้ใช้
- แก้ไขบริการจาก Microsoft.Extensions.DependencyInjection
ส่วนต่อไปนี้เกี่ยวข้องโดยตรงกับสิ่งที่คุณพยายามทำให้สำเร็จ:
3.26 การสร้างพื้นที่เก็บข้อมูลการรับรองความถูกต้องที่เป็นรูปธรรมและวิธีการลงทะเบียน
3.27 การสร้างวิธีการเก็บข้อมูลการเข้าสู่ระบบ
3.29 การสร้างวิธีการลงทะเบียนใน Auth Controller ของเรา
3.32 การตรวจสอบโทเค็น
ลูกค้าส่งโทเค็นไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์ไม่ได้ใช้ฐานข้อมูลเพื่อตรวจสอบความถูกต้องของผู้ใช้ แต่จะตรวจสอบโทเค็นเอง
3.33 การสร้างวิธีการเข้าสู่ระบบใน API
การอ้างสิทธิ์จะถูกเพิ่มลงในโทเค็นที่นี่:
AuthController.cs
public class AuthController : ControllerBase
{
[HttpPost("login")]
public async Task<IActionResult> Login(UserForLoginDto userForLoginDto)
{
…
return Ok(new {
token = GenerateJwtToken(appUser).Result,
user = userToReturn});}
}
private async Task<string> GenerateJwtToken(User user)
{
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.UserName)
};
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.GetSection("AppSettings:Token").Value));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
}
3.34 การใช้มิดเดิลแวร์การรับรองความถูกต้อง
JwtBearerDefaults.AuthenticationScheme
ลงทะเบียนกับ DI ที่นี่:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII
.GetBytes(Configuration.GetSection("AppSettings:Token").Value)),
ValidateIssuer = false,
ValidateAudience = false
};
});
}
}
4.39 ข้อมูลเบื้องต้นเกี่ยวกับบริการเชิงมุม
โทเค็นของผู้ใช้จะถูกจัดเก็บไว้ในที่จัดเก็บในตัวเครื่องในเบราว์เซอร์เมื่อเข้าสู่ระบบสำเร็จ:
auth.service.ts
export class AuthService {
login(model: any) {
return this.http.post(this.baseUrl + ‘login’, model).pipe(
map((response: any) => {
const user = response;
if(user) { localStorage.setItem(‘token’, user.token);}}));}}
6.55 การใช้ไลบรารี JWT เชิงมุมเพื่อถอดรหัสโทเค็น
เพิ่มคุณสมบัติสำหรับโทเค็นที่ถอดรหัสแล้วใน authService.ts
13.134 การใช้ตัวกรองการกระทำ
คุณสามารถ:
ตรวจสอบรหัสใบอนุญาตผ่านการอ้างสิทธิ์ในตัวกรองการดำเนินการ
กำหนดเส้นทาง API ปัจจุบันผ่าน ActionExecutingContext
นี่คือตัวอย่างการดึงข้อมูลการอ้างสิทธิ์ของผู้ใช้และการแก้ไขบริการจากภายในตัวกรองการดำเนินการ:
public class LogUserActivity : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var resultContext = await next();
var userId = int.Parse(resultContext.HttpContext.User
.FindFirst(ClaimTypes.NameIdentifier).Value);
var repo = resultContext.HttpContext.RequestServices.GetService<IDatingRepository>();
var user = await repo.GetUser(userId, true);
user.LastActive = DateTime.Now;
await repo.SaveAll();
}
}
if(context.HttpContext.User.Identity.IsAuthenticated)
cref: Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext.HttpContext.User.Identity.IsAuthenticated
- person RandyDaddis; 20.10.2019
Authorize
ปกติกับการกระทำของคุณ จากนั้นในActionFilter
ของคุณจะมีOnActionExecuting()
ที่คุณสามารถแทนที่ได้ โดยที่คุณสามารถเข้าถึง ControllerContext และมีคุณสมบัติUser
นี่จะถือเป็นการเรียกร้องของคุณทั้งหมด - person zaitsman   schedule 06.12.2018Microsoft.Extensions.DependencyInjection
แล้ว Autofac จะไม่เป็นสิ่งที่คุณเชื่อมต่อกับ DI ใน ASP.NET Core คำตอบสำหรับคำถามนี้จะเหมือนกันไม่ว่าคุณจะใช้ Autofac หรือไม่ก็ตาม - person Travis Illig   schedule 07.12.2018