Làm việc với User Secrets trong ứng dụng ASP.NET Core
Bài viết này chúng ta sẽ có một bài học về bảo mật dữ liệu trong project Github. Họ đã viết một crawler để tìm mật khẩu, username và các thông tin bảo mật khác trong project trên Github. Và họ đã tìm thấy rất nhiều các dữ liệu nhạy cảm của project, ngay cả với các công ty lớn, vậy nên chúng ta cần cẩn trọng hơn về bảo mật.
Hầu hết các thông tin credential được lưu trữ trong file config. Chắc chắn bạn cần config các thông tin như chuỗi kết nối CSDL, cấu hình mail, ftp...Trong nhiều trường hợp các credential này được sử dụng cho việc phát triển và nhiều hơn khi publish lên production.
Các thông tin nhạy cảm không nên được push lên bất cứ source repository nào. Tốt hơn nữa là không nên push lên public source repository nào.
Nhưng giải pháp ở đây là gì? Làm sao để cho ứng dụng biết được các thông tin đó để có thể chạy được?
Trên Azure, bạn có thể cấu hình ứng dụng trực tiếp trên application settings của ứng dụng. Nó sẽ ghi đè các setting trên file config bất kể cả web.config hay appsettings.json.
Nhưng bạn không thể làm điều đó với máy local. Không có config nào tương tự. Vậy làm thế nào để lưu thông tin đăng nhập hay thông tin nhạy cảm?
Với .NET Core đã có một thứ tương tự như vậy. Đó là SecretManager, cung cấp bởi .NET Core SDK (Microsoft.Extensions.SecretManager.Tools) bạn có thể truy cạp vào thông qua dotnet CLI.
Công cụ này lưu trữ thông tin bảo mật của bạn trên máy local. Đây không phải một công cụ quản lý password như kiểu keypass. Nó không thực sự bảo mật cao nhưng trên máy dev của bạn thì nó cung cấp khả năng để không lưu secret key của bạn trên file config của project. Đó chính là điểm mấu chốt.
Phải chắc chắn bạn có một userSecretsId trong file project (với .NET Core 2.0). Với ID này thì SecretManager gán cho ứng dụng:
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<UserSecretsId>aspnet-TeduCore.WebApp-335984DF-E2C0-4E8C-95DA-DAA5EC2A6341</UserSecretsId>
<TypeScriptToolsVersion>2.4</TypeScriptToolsVersion>
<BaseNuGetRuntimeIdentifier>win7-x64</BaseNuGetRuntimeIdentifier>
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup>
Nếu bạn tạo một ứng dụng ASP.NET Core mới trong Visual Studio, SecretManager đã được thêm sẵn. Giờ bạn chỉ cần truy cập vào các thông tin nhạy cảm qua ứng dụng của bạn. Trong project Visual Studio bạn cũng nên sử dụng AddUserSecret():
public Startup(IHostingEnvironment hostingEnvironment)
{
var builder = new ConfigurationBuilder()
.SetBasePath(hostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
if (hostingEnvironment.IsDevelopment())
{
builder.AddUserSecrets<Startup>();
}
Configuration = builder.Build();
}
Sau khi thêm builder.AddUserSecrets(); hiển thị như trên.
Extension Method AddUserSecrets() sẽ tải các secret key vào trong ứng dụng qua ConfigurationBuilder. Nếu các key này đã được tồn tại trong appsettings.json, file appsetting.json sẽ bị ghi đè.
Nếu tất cả xong xuôi bạn có thể dụng tool để lưu trữ một secret key mới bằng cách mở cửa sổ Command Promt tại thư mục của Web App:
dotnet user-secrets set key value
Nếu bạn muốn tạo một section mới như trong appsettings.config bạn cần kết hợp sectio name và setting name bởi dấu hai chấm:
"AppSettings": {
"MySecretKey": "Hallo from AppSettings",
"MyTopSecretKey": "Hallo from AppSettings"
},
Để ghi đè cac key này bạn chỉ cần dùng SecretManager, bạn ẽ tạo một entry với câu lệnh như sau:
dotnet user-secrets set AppSettings:MySecretKey "Hello from UserSecretStore"
dotnet user-secrets set AppSettings:MyTopSecretKey "Hello from UserSecretStore"

Chú ý: để ghi đè key đã tồn tại với giá trị mới, chỉ cần gọi lệnh set lại với cùng key nhưng giá trị mới.
Cách này làm việc ok với tôi.
The SecretManager có thêm vài câu lệnh như sau:
dotnet user-secrets clear: xoá tất cả các key đã tồn tạidotnet user-secrets list: hiển thị danh sách keydotnet user-secrets remove <key>: xoá một key cụ thể
Chỉ cần gõ dotnet user-secrets --help để hiển thị các câu lệnh cần thiết.
Nếu bạn cần quản lý vào secret key trong ứng dụng, bạn có thể tạo một batch file để add key và chia sẻ với các môi trường khác nhau nhưng đừng đẩy lên code repository.
Trích nguồn từ: asp.net-hacker.rocks
Tags:
Bài viết liên quan
Kẻ tấn công giả danh IT hỗ trợ trên Microsoft Teams, lợi dụng AD CS để đánh cắp dữ liệu doanh nghiệp
Microsoft điều tra hai vụ xâm nhập trong đó kẻ tấn công giả danh nhân viên IT trên Microsoft Teams để chiếm quyền điều khiển máy tính, sau đó khai thác cấu hình AD CS yếu để lấy chứng chỉ đăng nhập của tài khoản đặc quyền và domain controller.
Đọc thêm
Điểm tin tuần: Lỗ hổng CVE nghiêm trọng, botnet DDoS Linux, lừa đảo device-code và spyware Android
Tuần qua ghi nhận loạt sự kiện an ninh mạng lớn: Triều Tiên bị quy trách nhiệm vụ trộm 6,43 tỷ USD crypto từ Binance, nhóm Volt Typhoon dùng mạng Silent Train, cùng nhiều lỗ hổng CVE nghiêm trọng cần vá gấp.
Đọc thêm
VOLTA: Mã độc đánh cắp thông tin mới dùng AI để xếp hạng nạn nhân theo giá trị tài chính
Các nhà nghiên cứu bảo mật phát hiện mã độc VOLTA trên Windows dùng mô hình ngôn ngữ lớn như Claude, Kimi và Gemini để phân tích dữ liệu đánh cắp và xếp hạng nạn nhân theo giá trị kiếm tiền.
Đọc thêm
Lỗ hổng nghiêm trọng trong Langflow cho phép kẻ tấn công chưa xác thực chạy mã trên máy chủ
IBM công bố hai lỗ hổng nghiêm trọng trong Langflow, công cụ mã nguồn mở xây dựng AI agent, cho phép kẻ tấn công không cần tài khoản vượt xác thực hoặc chạy mã tùy ý; bản vá duy nhất là phiên bản 1.13.0.
Đọc thêm
eMudhra và lỗ hổng khóa yếu: dấu vết khai thác và tiến độ vá lỗi
Cloudflare ghi nhận khoảng 22.000 lần bắt tay TLS dùng khóa yếu của eMudhra, phần lớn bị chặn nhờ vá lỗi kịp thời; eMudhra tuyên bố rời thị trường CA công cộng.
Đọc thêm
Lỗ hổng CVSS 10.0 trong LXD và MicroCloud cho phép giả mạo client tin cậy mà không cần khóa riêng
Lỗ hổng nghiêm trọng CVE-2026-112816 trong LXD và MicroCloud của Canonical cho phép kẻ tấn công đăng nhập với tư cách client tin cậy chỉ với chứng chỉ công khai, đạt điểm CVSS tối đa 10.0. Canonical đã phát hành bản vá.
Đọc thêm
NetamLoader tấn công hệ thống Windows 10 của chính phủ châu Á qua .NET injection
Kaspersky phát hiện chuỗi lây nhiễm tinh vi nhắm vào bản Windows 10 tùy chỉnh dành riêng cho cơ quan chính phủ ở châu Á, sử dụng framework .NET có tên NetamLoader.
Đọc thêm
Cloudflare ghi nhận 18,2 triệu cuộc tấn công DDoS lớp mạng trong quý 3, tăng 38%
Cloudflare cho biết đã tự động chặn 18,2 triệu cuộc tấn công DDoS lớp mạng và 14,4 nghìn tỷ yêu cầu HTTP DDoS trong quý 3/2026, tương đương khoảng 8.226 cuộc tấn công mỗi giờ.
Đọc thêm
Lỗ hổng link chia sẻ ChatGPT có thể chạy mã độc trong phiên đăng nhập và đọc hội thoại riêng tư
Các nhà nghiên cứu tại Parameter phát hiện một link chia sẻ ChatGPT độc hại có thể chạy mã của kẻ tấn công trong phiên đăng nhập của nạn nhân, đọc hội thoại riêng tư. OpenAI đã vá lỗi và trả 5.000 USD tiền thưởng.
Đọc thêm
Tin tặc kết hợp ba lỗ hổng Ivanti Connect Secure để chiếm quyền root không cần xác thực
CISA đưa hai lỗ hổng Ivanti Connect Secure vào danh mục KEV sau khi bị khai thác thực tế, trong chuỗi khai thác ba lỗ hổng cho phép chiếm quyền root mà không cần xác thực.
Đọc thêm