doanxemnao
Senior Member
cty vn vẫn đang làm .net đây ạCó thật là làm .NET thì sẽ chủ yếu làm cho các thị trường Âu Mỹ không vậy các bác ?
)) vì toàn dùng winservercty vn vẫn đang làm .net đây ạCó thật là làm .NET thì sẽ chủ yếu làm cho các thị trường Âu Mỹ không vậy các bác ?
)) vì toàn dùng winservervalidate 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.
Đúng rồi fen.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
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 ạ.
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();
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);
}
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?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; } } }
Em có set bearer token bác ạ. Em dùng cả postman lẫn swagger đều không đượcToken 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?
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 ở đâuEm 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![]()

Chúc mừng fen đã vượt qua được 1 thử thách.À em fix được rồi bác ạ. Nó bị thiếu cái defaul scheme
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

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.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
Em cảm ơn!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 đó.
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 SpringBootcty vn vẫn đang làm .net đây ạ)) vì toàn dùng winserver
Kiến thức thì đừng chờ đợi hay thích thì làm.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
Ổn nhé bạn. Mình dev .net core đây.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
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
UserManager<IdentityUser> userManager,
RoleManager<IdentityRole> roleManager)
{
...
DataSeedingInitializer.UserAndRoleSeedAsync(userManager, roleManager).Wait();
...
}

using var scope = app.Services.CreateScope();
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();