thảo luận [.NET] Topic thảo luận các vấn đề xoay quanh .Net

  • Người tạo chủ đề Người tạo chủ đề pi nguyen
  • Ngày bắt đầu Ngày bắt đầu
Có gì xài đó thôi.
Ai dám lên docker rồi chạy k8s đâu.
Có quá nhiều rủi ro mà doanh nghiệp phải tính toán.
 
validate nó nằm trong lib.
Bạn có thể lên github của dotnet mà xem nó làm cái gì trong đó.
Keyword middleware dotnet core api.

Vậy là mình chỉ cần con config như này là được đúng không bác. Em thấy hơi khó hiểu

Sent from Xiaomi redmi note 4x using vozFApp
 
Đúng rồi fen.
Lên trang M$ nó chỉ cách gắn jwt vào mà.
Cách authenticate trên dotnet core api
Em cấu hình mãi mà nó không validate được token bác ạ. Sau khi login, em lấy cái token đấy để gửi request mà nó toàn báo 401, bác xem giúp em với ạ.
Em vẫn đang thắc mắc là khi gửi request kèm token thì làm sao nó có thể chọc vào DB để validate cái thông tin đó ạ

Đây là file program.cs

C#:
global using Demo.Data;
global using Microsoft.EntityFrameworkCore;
using System.Text;
using Demo.Configuration;
using Demo.Converter;
using Demo.Services;
using Demo.Services.Impl;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddTransient<StudentService, StudentServiceImpl>();
builder.Services.AddTransient<AuthService, AuthServiceImpl>();
builder.Services.AddSingleton<StudentConverter>();
builder.Services.AddSingleton<SecurityConfiguration>();
builder.Services.AddDbContext<DataContext>(options => {
    options.UseSqlServer(builder.Configuration.GetConnectionString("DevConnection"));
});

builder.Services.AddAuthentication(options => {
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => {
    options.SaveToken = true;
    options.RequireHttpsMetadata = false;
    options.TokenValidationParameters = new TokenValidationParameters() {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidAudience = builder.Configuration["Jwt:Audience"],
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
    };
});

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c => {
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "DemoJWT", Version = "V1" });
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme {
        Description = "Jwt Authorization",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        Scheme = "Bearer"
    });
 
    c.AddSecurityRequirement(new OpenApiSecurityRequirement {
        {
            new OpenApiSecurityScheme {
                Reference = new OpenApiReference {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer"
                }
            }, new string[]{}
        }
    });
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) {
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "DemoJWTToken v1"));
}

app.UseHttpsRedirection();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

Đây là đoạn generate Token
C#:
private string generateToken(Student student) {
        List<Claim> claims = new List<Claim> {
            new Claim("Username", student.Username)
        };

        var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(
            configuration.GetSection("Jwt:Key").Value));
        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);
        var token = new JwtSecurityToken(
            claims: claims,
            expires: DateTime.Now.AddMinutes(10),
            signingCredentials: credentials);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }


Còn đây là dataContext ạ

C#:
namespace Demo.Data {
    public class DataContext : DbContext {
        public DataContext(DbContextOptions<DataContext> options) : base(options) {

        }

        public DataContext() {
        
        }

        public DbSet<Student> Students { get; set; }
        public DbSet<Subject> Subjects { get; set; }
        public DbSet<Major> Majors { get; set; }
    }
}
 
Sửa lần cuối:
Em cấu hình mãi mà nó không validate được token bác ạ. Sau khi login, em lấy cái token đấy để gửi request mà nó toàn báo 401, bác xem giúp em với ạ.
Em vẫn đang thắc mắc là khi gửi request kèm token thì làm sao nó có thể trỏ tới DB lưu thông tin user để validate ạ

Đây là file program.cs

C#:
global using Demo.Data;
global using Microsoft.EntityFrameworkCore;
using System.Text;
using Demo.Configuration;
using Demo.Converter;
using Demo.Services;
using Demo.Services.Impl;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddTransient<StudentService, StudentServiceImpl>();
builder.Services.AddTransient<AuthService, AuthServiceImpl>();
builder.Services.AddSingleton<StudentConverter>();
builder.Services.AddSingleton<SecurityConfiguration>();
builder.Services.AddDbContext<DataContext>(options => {
    options.UseSqlServer(builder.Configuration.GetConnectionString("DevConnection"));
});

builder.Services.AddAuthentication(options => {
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => {
    options.SaveToken = true;
    options.RequireHttpsMetadata = false;
    options.TokenValidationParameters = new TokenValidationParameters() {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidAudience = builder.Configuration["Jwt:Audience"],
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
    };
});

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c => {
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "DemoJWT", Version = "V1" });
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme {
        Description = "Jwt Authorization",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        Scheme = "Bearer"
    });
 
    c.AddSecurityRequirement(new OpenApiSecurityRequirement {
        {
            new OpenApiSecurityScheme {
                Reference = new OpenApiReference {
                    Type = ReferenceType.SecurityScheme,
                    Id = "Bearer"
                }
            }, new string[]{}
        }
    });
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) {
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "DemoJWTToken v1"));
}

app.UseHttpsRedirection();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

Đây là đoạn generate Token
C#:
private string generateToken(Student student) {
        List<Claim> claims = new List<Claim> {
            new Claim("Username", student.Username)
        };

        var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(
            configuration.GetSection("Jwt:Key").Value));
        var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature);
        var token = new JwtSecurityToken(
            claims: claims,
            expires: DateTime.Now.AddMinutes(10),
            signingCredentials: credentials);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }


Còn đây là dataContext ạ

C#:
namespace Demo.Data {
    public class DataContext : DbContext {
        public DataContext(DbContextOptions<DataContext> options) : base(options) {

        }

        public DataContext() {
         
        }

        public DbSet<Student> Students { get; set; }
        public DbSet<Subject> Subjects { get; set; }
        public DbSet<Major> Majors { get; set; }
    }
}
Token không có lưu lại nha, trong jwt nó có signature để check token hợp lệ hay không thôi cần gì check dưới DB. Bị 401 thì coi chừng request bạn gửi lên chưa có header bearer token?
 
Token không có lưu lại nha, trong jwt nó có signature để check token hợp lệ hay không thôi cần gì check dưới DB. Bị 401 thì coi chừng request bạn gửi lên chưa có header bearer token?
Em có set bearer token bác ạ. Em dùng cả postman lẫn swagger đều không được
À cái đoạn lưu token em hơi nhầm chút, đúng ra là nó sẽ chọc tới DB để check thì phải, mà em không hiểu làm sao nó có thể chọc vào bảng user của mình được ấy (trường hợp này của em là bảng Students)
 
Em có set bearer token bác ạ. Em dùng cả postman lẫn swagger đều không được
À cái đoạn lưu token em hơi nhầm chút, đúng ra là nó sẽ chọc tới DB để check thì phải, mà em không hiểu làm sao nó có thể chọc vào bảng user của mình được ấy (trường hợp này của em là bảng Students)
Cái đoạn Services.AddAuthentication.AddJwtBearer là nó check token của bạn có valid hay không rồi (check authentication - 401), mục đích của jwt sinh ra để nhanh gọn mà chọc tới db làm gì, trừ khi bạn check authorize - 403 với điều kiện gì đó. Còn bạn bị vướng ở 401 thì google tutorial xem thử đi, mình thấy nhiều mà, chứ post nhiêu đó chưa đủ thông tin để bắt lỗi ở đâu :)
 
Cái đoạn Services.AddAuthentication.AddJwtBearer là nó check token của bạn có valid hay không rồi (check authentication - 401), mục đích của jwt sinh ra để nhanh gọn mà chọc tới db làm gì, trừ khi bạn check authorize - 403 với điều kiện gì đó. Còn bạn bị vướng ở 401 thì google tutorial xem thử đi, mình thấy nhiều mà, chứ post nhiêu đó chưa đủ thông tin để bắt lỗi ở đâu :)

À em fix được rồi bác ạ. Nó bị thiếu cái defaul scheme :D

Sent from Xiaomi redmi note 4x using vozFApp
 
Thấy bảo là nhanh ngang Dapper mà mấy cái tính năng trả phí của Dapper cũng có luôn

Nhiều thứ mình thấy hay ho phết.
Cơ mà tài liệu toàn tiếng tàu, khó tiếp cận hết đc.
Về performance theo mình thì nó nhanh hơn Ef
Còn vs dapper do mình chưa dùng nên ko rõ :D

Gửi từ Xiaomi 2211133C bằng vozFApp
 
Các bác có cách nào để lưu token dưới client ổn và hạn chế việc bị leak ko ạ?

Gửi từ Xiaomi 2211133C bằng vozFApp
 
Các bác có cách nào để lưu token dưới client ổn và hạn chế việc bị leak ko ạ?

Gửi từ Xiaomi 2211133C bằng vozFApp
Token là cái chìa khóa, có giới hạn thời gian có thể mở cửa, mặc định là 3600s.
Người ta lưu token vào cache storage, cookie, có mã hóa 2 chiều.
Lúc gửi request thì đã được mã hóa của SSL rồi nên rất khó leak.
Đừng quá lo lắng về điều đó.
 
Token là cái chìa khóa, có giới hạn thời gian có thể mở cửa, mặc định là 3600s.
Người ta lưu token vào cache storage, cookie, có mã hóa 2 chiều.
Lúc gửi request thì đã được mã hóa của SSL rồi nên rất khó leak.
Đừng quá lo lắng về điều đó.
Em cảm ơn!

Gửi từ Xiaomi 2211133C bằng vozFApp
 
E đang muốn tham gia các cty làm thị trường này, h học NET Core thì có ổn không nhỉ. Em background từ mobile, cũng biết ít SpringBoot
Kiến thức thì đừng chờ đợi hay thích thì làm.
Hãy suy nghĩ cái lợi ích mình dày công trau dồi.
Không phải là tiền bạc mà là sự thông thái.
 
Hello mấy thím, mình có follow theo 1 tutorial trên udemy xài .net core 2.2, mình thì code theo nhưng xài .net 6 nhưng đang bị vướng phần cấu hình ở file startup.cs (.net core 2.2) và program.cs (.net 6) như sau:
Theo tutorial thì cấu hình ở file startup.cs như sau:
C#:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
                      UserManager<IdentityUser> userManager,
                      RoleManager<IdentityRole> roleManager)
    {
        ...
        
        DataSeedingInitializer.UserAndRoleSeedAsync(userManager, roleManager).Wait();

        ...
    }
Giải thích: ở hàm Configure thì tutorial có thêm parameter userManager và roleManager để khai báo cho dòng DataSeedingInitializer.

Với .net6 thì mình không biết khai báo 2 parameter đó ở đâu trong file Program.cs để có thể sử dụng được hàm DataSeedingInitialize, vì vậy VS nó báo lỗi:
nvThtuq.png

Thím nào biết giúp mình với, cảm ơn mấy thím đã quan tâm :beauty:
 

Thống kê chủ đề

Ngày tạo
pi nguyen,
Người trả lời cuối
keandanh123000,
Trả lời
2.024
Lượt xem
267.387
Quay lại
Lên đầu trang