การอนุญาตที่กำหนดเองใน Asp.net core 2.1 web api

ฉันต้องการสกัดกั้นคำขอเว็บแต่ละรายการที่มาถึง API ในระหว่างคำขอแต่ละรายการฉันต้องการเรียกใช้ฟังก์ชันที่ฉันเขียนซึ่งจะบอกฉันว่าผู้ใช้มีรหัสลิขสิทธิ์ที่ถูกต้องไม่หมดอายุ สองสามสิ่งที่ฉันจะต้องมีคือสิ่งหนึ่งที่สามารถระบุผู้ใช้ได้ ฉันสามารถทำได้โดยการแกะโทเค็น JWT ฉันจะต้องเข้าถึงโทเค็นนั้น นอกจากนี้ ฉันจะต้องสามารถเรียกวิธีการจากคลาสใดคลาสหนึ่งของฉันได้ ซึ่งก็คือ ลงทะเบียนสำหรับการฉีดโดยใช้ autofac แล้ว ฉันรู้ว่ามีตัวกรองการดำเนินการและมิดเดิลแวร์ที่ฉันสามารถเชื่อมโยงได้ แต่ฉันไม่ค่อยมีประสบการณ์ในการใช้สิ่งใดสิ่งหนึ่งเหล่านี้ ฉันกำลังมองหาวิธีที่ดีที่สุดในการทำเช่นนี้บางทีอาจชี้ให้ฉันดูตัวอย่างด้วย โอ้และฉันจะต้องรู้เส้นทางด้วย มีวิธี API สองสามวิธีที่ได้รับการยกเว้นจากการตรวจสอบนี้ หากเช็ครู้สึกว่าฉันต้องการส่งคำขออย่างชัดเจน อาจส่งข้อผิดพลาด 401 หรืออะไรสักอย่าง


person talkersoft    schedule 06.12.2018    source แหล่งที่มา
comment
เพียงใช้ Authorize ปกติกับการกระทำของคุณ จากนั้นใน ActionFilter ของคุณจะมี OnActionExecuting() ที่คุณสามารถแทนที่ได้ โดยที่คุณสามารถเข้าถึง ControllerContext และมีคุณสมบัติ User นี่จะถือเป็นการเรียกร้องของคุณทั้งหมด   -  person zaitsman    schedule 06.12.2018
comment
ใช่แต่มันไม่ตรงไปตรงมานักที่จะใช้การพึ่งพาการฉีดกับฟิลเตอร์แอ็คชั่น...   -  person talkersoft    schedule 06.12.2018
comment
stackoverflow.com/questions/32459670 / การใช้ DI ในแกน asp.net   -  person No Refunds No Returns    schedule 06.12.2018
comment
ฉันจะเพิกเฉยต่อแง่มุมของ Autofac; นอกเหนือจากการสำรองข้อมูล Microsoft.Extensions.DependencyInjection แล้ว Autofac จะไม่เป็นสิ่งที่คุณเชื่อมต่อกับ DI ใน ASP.NET Core คำตอบสำหรับคำถามนี้จะเหมือนกันไม่ว่าคุณจะใช้ Autofac หรือไม่ก็ตาม   -  person Travis Illig    schedule 07.12.2018


คำตอบ (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();
    }
}
person RandyDaddis    schedule 08.12.2018
comment
ฉันต้องการตรวจสอบตัวกรองการดำเนินการว่าผู้ใช้ได้รับการรับรองความถูกต้องหรือไม่ ฉันควรทำอย่างไร? - person El7or; 19.10.2019
comment
ในเมธอด OnActionExecutionAsync() ด้านบน ให้ลองใช้ if(context.HttpContext.User.Identity.IsAuthenticated) cref: Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext.HttpContext.User.Identity.IsAuthenticated - person RandyDaddis; 20.10.2019