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.
Otorisasi Khusus di api web Asp.net core 2.1
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();
}
}
if(context.HttpContext.User.Identity.IsAuthenticated)
cref: Microsoft.AspNetCore.Mvc.Filters.ActionExecutingContext.HttpContext.User.Identity.IsAuthenticated
- person RandyDaddis; 20.10.2019
Authorize
normal pada tindakan Anda. Kemudian diActionFilter
Anda akan adaOnActionExecuting()
yang bisa Anda timpa. Di dalamnya Anda mendapatkan akses ke ControllerContext dan memiliki propertiUser
. Ini akan memenuhi semua klaim Anda - person zaitsman   schedule 06.12.2018Microsoft.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