احراز هویت پایگاه داده AWS IAM با EF Core
Summarize this content to 400 words in Persian Lang AWS Aurora (هم MySQL و هم Postgres) و MariaDB اجازه احراز هویت IAM را می دهند. با استفاده از این روش احراز هویت، هنگام اتصال به پایگاه داده نیازی به استفاده از رمز عبور ندارید. در عوض، از یک نشانه احراز هویت استفاده می کنید. در این پست، ما قصد داریم نحوه استفاده از احراز هویت پایگاه داده IAM با EF Core و Aurora Postgres را بررسی کنیم.
قبل از شروع، باید چند پیش نیاز را رعایت کنید:
فعال کردن IAM Authentication در پایگاه داده Aurora Postgres.
یک کاربر IAM با دسترسی برنامه ای داشته باشید.
AWS CLI خود را به صورت محلی تنظیم کنید.
اولین قدم ایجاد یک خط مشی IAM با استفاده از این الگو است:
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“rds-db:connect”
],
“Resource”: [
“arn:aws:rds-db:[region]:[account-id]:dbuser:[db-cluster-resourceId]/[db-user-name]”
]
}
]
}
[account-id] شماره حساب AWS برای کلاستر پایگاه داده است. نمونه ای از شماره حساب است 1234567890.
[db-cluster-resourceId] شناسه کلاستر پایگاه داده است. نمونه ای از این شناسه است cluster-ABCDEFGHIJKL01234.
[db-user-name] نام حساب پایگاه داده مرتبط با احراز هویت IAM است.
هنگامی که آن را داریم، آن را به کاربر IAM خود متصل می کنیم. مرحله بعدی ایجاد یک پایگاه داده است (ما از آن استفاده می کنیم postgres کاربر برای اجرای اسکریپت های زیر:
CREATE DATABASE tasksmanager
WITH
ENCODING = ‘UTF8’;
و سپس یک جدول در داخل این پایگاه داده جدید:
CREATE TABLE tasks(
id UUID PRIMARY KEY,
name VARCHAR(255)
);
و در نهایت کاربر پایگاه داده:
CREATE USER db_iam_user;
GRANT rds_iam TO db_iam_user;
GRANT postgres TO db_iam_user;
اکنون یک برنامه API .NET ASP Core Web ایجاد می کنیم. بسته های NuGet زیر را به آن برنامه اضافه کنید:
AWSSDK.RDS.
Npgsql.EntityFrameworkCore.PostgreSQL.
EFCore.NamingConventions.
در ما appsetting.json، ما قصد داریم a را اضافه کنیم ConnectionString دارایی:
{
“Logging”: {
“LogLevel”: {
“Default”: “Information”,
“Microsoft.AspNetCore”: “Warning”
}
},
“AllowedHosts”: “*”,
“ConnectionString”: “host=[aurora-database-endpoint];Database=tasksmanager;Username=db_iam_user;SSL Mode=Require;TrustServerCertificate=true”
}
یک فایل با محتوای زیر اضافه کنید:
public class Task
{
public Guid Id { get; set; }
public string Name { get; set; }
private Task()
{
}
public Task(string name)
{
Id = Guid.NewGuid();
Name = name;
}
}
با آن، ما می توانیم خود را ایجاد کنیم DbContext کلاس:
public class ApplicationDbContext : DbContext
{
public DbSet<Task> Tasks { get; set; }
public ApplicationDbContext(DbContextOptions options) : base(options)
{
}
}
حالا یک را اضافه کنید ServiceCollectionExtensions.cs فایل اینجا جایی است که همه جادو اتفاق می افتد:
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddPostgreSQL(this IServiceCollection services, IConfiguration configuration)
{
services.AddDbContext<ApplicationDbContext>(options =>
{
var connectionString = configuration[“ConnectionString”];
options.UseNpgsql(connectionString, npgsqlOption => { npgsqlOption.UseAwsIamAuthentication(); });
options.UseLowerCaseNamingConvention();
});
return services;
}
public static NpgsqlDbContextOptionsBuilder UseAwsIamAuthentication(this NpgsqlDbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.ProvidePasswordCallback(RequestAwsIamAuthToken);
return optionsBuilder;
}
static string RequestAwsIamAuthToken(string host, int port, string database, string username)
{
return RDSAuthTokenGenerator.GenerateAuthToken(host, port, username);
}
}
سپس خط زیر را به خط خود اضافه کنید Program.cs فایل:
builder.Services.AddPostgreSQL(builder.Configuration);
برای درخواست و پاسخ ما چند مدل اضافه کنید:
public class RegisterTaskCommand
{
public string Name { get; set; }
}
public class ListTasksResult
{
public Guid Id { get; set; }
public string Name { get; set; }
}
و در نهایت، ما TaskController.cs فایل:
[ApiController]
[Route(“[controller]”)]
public class TasksController : ControllerBase
{
private readonly ApplicationDbContext _context;
public TasksController(ApplicationDbContext context)
{
_context = context;
}
[HttpGet()]
public Task<ListTasksResult[]> ListTasks()
{
return _context.Tasks.Select(t => new ListTasksResult() { Id = t.Id, Name = t.Name }).ToArrayAsync();
}
[HttpPost()]
public async Task<Guid> RegisterTask(RegisterTaskCommand command)
{
var task = new Task(command.Name);
_context.Tasks.Add(task);
await _context.SaveChangesAsync();
return task.Id;
}
}
برنامه خود را اجرا کنید و اتصال بدون رمز عبور خود را با پایگاه داده خود آزمایش کنید. در اینجا، می توانید تمام کدها و اسکریپت های پایگاه داده را پیدا کنید.
AWS Aurora (هم MySQL و هم Postgres) و MariaDB اجازه احراز هویت IAM را می دهند. با استفاده از این روش احراز هویت، هنگام اتصال به پایگاه داده نیازی به استفاده از رمز عبور ندارید. در عوض، از یک نشانه احراز هویت استفاده می کنید. در این پست، ما قصد داریم نحوه استفاده از احراز هویت پایگاه داده IAM با EF Core و Aurora Postgres را بررسی کنیم.
قبل از شروع، باید چند پیش نیاز را رعایت کنید:
-
فعال کردن IAM Authentication در پایگاه داده Aurora Postgres.
-
یک کاربر IAM با دسترسی برنامه ای داشته باشید.
-
AWS CLI خود را به صورت محلی تنظیم کنید.
اولین قدم ایجاد یک خط مشی IAM با استفاده از این الگو است:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
"arn:aws:rds-db:[region]:[account-id]:dbuser:[db-cluster-resourceId]/[db-user-name]"
]
}
]
}
-
[region]
منطقه AWS برای خوشه پایگاه داده است. نمونه ای از یک منطقه استus-east-2
. -
[account-id]
شماره حساب AWS برای کلاستر پایگاه داده است. نمونه ای از شماره حساب است1234567890
. -
[db-cluster-resourceId]
شناسه کلاستر پایگاه داده است. نمونه ای از این شناسه استcluster-ABCDEFGHIJKL01234
. -
[db-user-name]
نام حساب پایگاه داده مرتبط با احراز هویت IAM است.
هنگامی که آن را داریم، آن را به کاربر IAM خود متصل می کنیم. مرحله بعدی ایجاد یک پایگاه داده است (ما از آن استفاده می کنیم postgres
کاربر برای اجرای اسکریپت های زیر:
CREATE DATABASE tasksmanager
WITH
ENCODING = 'UTF8';
و سپس یک جدول در داخل این پایگاه داده جدید:
CREATE TABLE tasks(
id UUID PRIMARY KEY,
name VARCHAR(255)
);
و در نهایت کاربر پایگاه داده:
CREATE USER db_iam_user;
GRANT rds_iam TO db_iam_user;
GRANT postgres TO db_iam_user;
اکنون یک برنامه API .NET ASP Core Web ایجاد می کنیم. بسته های NuGet زیر را به آن برنامه اضافه کنید:
-
AWSSDK.RDS.
-
Npgsql.EntityFrameworkCore.PostgreSQL.
-
EFCore.NamingConventions.
در ما appsetting.json
، ما قصد داریم a را اضافه کنیم ConnectionString
دارایی:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionString": "host=[aurora-database-endpoint];Database=tasksmanager;Username=db_iam_user;SSL Mode=Require;TrustServerCertificate=true"
}
یک فایل با محتوای زیر اضافه کنید:
public class Task
{
public Guid Id { get; set; }
public string Name { get; set; }
private Task()
{
}
public Task(string name)
{
Id = Guid.NewGuid();
Name = name;
}
}
با آن، ما می توانیم خود را ایجاد کنیم DbContext
کلاس:
public class ApplicationDbContext : DbContext
{
public DbSet<Task> Tasks { get; set; }
public ApplicationDbContext(DbContextOptions options) : base(options)
{
}
}
حالا یک را اضافه کنید ServiceCollectionExtensions.cs
فایل اینجا جایی است که همه جادو اتفاق می افتد:
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddPostgreSQL(this IServiceCollection services, IConfiguration configuration)
{
services.AddDbContext<ApplicationDbContext>(options =>
{
var connectionString = configuration["ConnectionString"];
options.UseNpgsql(connectionString, npgsqlOption => { npgsqlOption.UseAwsIamAuthentication(); });
options.UseLowerCaseNamingConvention();
});
return services;
}
public static NpgsqlDbContextOptionsBuilder UseAwsIamAuthentication(this NpgsqlDbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.ProvidePasswordCallback(RequestAwsIamAuthToken);
return optionsBuilder;
}
static string RequestAwsIamAuthToken(string host, int port, string database, string username)
{
return RDSAuthTokenGenerator.GenerateAuthToken(host, port, username);
}
}
سپس خط زیر را به خط خود اضافه کنید Program.cs
فایل:
builder.Services.AddPostgreSQL(builder.Configuration);
برای درخواست و پاسخ ما چند مدل اضافه کنید:
public class RegisterTaskCommand
{
public string Name { get; set; }
}
public class ListTasksResult
{
public Guid Id { get; set; }
public string Name { get; set; }
}
و در نهایت، ما TaskController.cs
فایل:
[ApiController]
[Route("[controller]")]
public class TasksController : ControllerBase
{
private readonly ApplicationDbContext _context;
public TasksController(ApplicationDbContext context)
{
_context = context;
}
[HttpGet()]
public Task<ListTasksResult[]> ListTasks()
{
return _context.Tasks.Select(t => new ListTasksResult() { Id = t.Id, Name = t.Name }).ToArrayAsync();
}
[HttpPost()]
public async Task<Guid> RegisterTask(RegisterTaskCommand command)
{
var task = new Task(command.Name);
_context.Tasks.Add(task);
await _context.SaveChangesAsync();
return task.Id;
}
}
برنامه خود را اجرا کنید و اتصال بدون رمز عبور خود را با پایگاه داده خود آزمایش کنید. در اینجا، می توانید تمام کدها و اسکریپت های پایگاه داده را پیدا کنید.