Otorisasi Khusus di api web Asp.net core 2.1

Saya ingin mencegat setiap permintaan web yang masuk ke api, selama setiap permintaan saya ingin memanggil fungsi yang saya tulis yang akan memberi tahu saya bahwa pengguna memiliki kunci lisensi yang valid dan tidak kedaluwarsa. Beberapa hal yang saya perlukan adalah untuk dapat mengidentifikasi pengguna, saya dapat melakukannya dengan membuka bungkus token JWT. Saya memerlukan akses ke token itu, saya juga harus dapat memanggil metode dari salah satu kelas saya yaitu sudah terdaftar untuk injeksi menggunakan autofac. Saya tahu bahwa ada filter tindakan, dan middleware yang bisa saya gunakan, tetapi saya belum punya banyak pengalaman menggunakan salah satu dari ini, saya mencari cara terbaik untuk melakukan ini bahkan mungkin mengarahkan saya ke beberapa contoh. Oh dan saya juga harus bisa mengetahui rutenya, ada beberapa metode API yang dikecualikan dari pemeriksaan ini. Jika pengecekannya terasa saya jelas ingin membuang permintaan tersebut, mungkin menimbulkan kesalahan 401 atau semacamnya.


person talkersoft    schedule 06.12.2018    source sumber
comment
Cukup gunakan Authorize normal pada tindakan Anda. Kemudian di ActionFilter Anda akan ada OnActionExecuting() yang bisa Anda timpa. Di dalamnya Anda mendapatkan akses ke ControllerContext dan memiliki properti User. Ini akan memenuhi semua klaim Anda   -  person zaitsman    schedule 06.12.2018
comment
Benar, tetapi tidak mudah menggunakan injeksi ketergantungan dengan filter tindakan...   -  person talkersoft    schedule 06.12.2018
comment
stackoverflow.com/questions/32459670 / Menggunakan DI di inti asp.net   -  person No Refunds No Returns    schedule 06.12.2018
comment
Saya akan mengabaikan aspek Autofac; selain mendukung hal Microsoft.Extensions.DependencyInjection, Autofac tidak akan menjadi antarmuka Anda untuk DI di ASP.NET Core. Jawaban atas pertanyaan ini akan tetap sama baik Anda menggunakan Autofac atau tidak.   -  person Travis Illig    schedule 07.12.2018


Jawaban (1)


Saya sangat merekomendasikan kursus Udemy Neil Cummings Bangun Aplikasi dengan ASPNET Core dan Angular From Scratch

solusi contoh mencakup lisensi MIT.

Kursus 28 jam dan solusi terkait ini menggunakan:

  • Token JWT dan Microsoft.AspNetCore.Identity untuk autentikasi
  • IAsyncActionFilter to:
    • intercept web requests
    • membaca Klaim pengguna
    • menyelesaikan layanan dari Microsoft.Extensions.DependencyInjection

Bagian berikut berhubungan langsung dengan apa yang ingin Anda capai:

3.26 Membuat Repositori Auth Konkret dan Metode Pendaftaran

3.27 Membuat metode Repositori Login

3.29 Membuat Metode Daftar di Pengontrol Auth kami

3.32 Otentikasi Token

Klien mengirimkan token ke server. Server tidak menggunakan database untuk memvalidasi pengguna, melainkan memvalidasi token itu sendiri.

3.33 Membuat Metode Login di API

Klaim ditambahkan ke token di sini:

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 Menggunakan Middleware Otentikasi

JwtBearerDefaults.AuthenticationScheme terdaftar di DI di sini:

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 Pengantar Layanan Angular

Token pengguna disimpan ke penyimpanan lokal di browser setelah login berhasil:

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 Menggunakan Perpustakaan JWT Angular untuk Mendekode Token

Menambahkan properti untuk token yang didekodekan ke authService.ts

13.134 Menggunakan Filter Tindakan

Anda bisa:

  • memvalidasi kunci lisensi melalui Klaim di Filter Tindakan

  • Tentukan rute API saat ini melalui ActionExecutingContext

Berikut adalah contoh pengambilan klaim pengguna serta penyelesaian layanan dari dalam Filter Tindakan:

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
Saya ingin memeriksa filter tindakan apakah pengguna diautentikasi atau tidak, Apa yang dapat saya lakukan? - person El7or; 19.10.2019
comment
dalam metode OnActionExecutionAsync() di atas, coba if(context.HttpContext.User.Identity.IsAuthenticated) cref: Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext.HttpContext.User.Identity.IsAuthenticated - person RandyDaddis; 20.10.2019