我有兩個專案,一個是 MVC 的客戶端,另一個是 Web API 專案,它們都在 .Net 6 中。
Web API 端
我想對來到客戶端的用戶進行身份驗證。我知道向 Web API 添加身份驗證最推薦的方法是 JWT 令牌。因此,我將以下代碼添加到我的 Web API program.cs 類中以使用 JWT 身份驗證。
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
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"]))
};
});
接下來,我在 Web API 中添加了一個登錄方法,如下所示,它只是生成 JWT 令牌并回傳該令牌。不添加 GenerateToken() 代碼以保持簡單
[HttpGet]
[Route("login")]
public JsonResult Login()
{
var token = TokenHelper.GenerateToken();
return new JsonResult(new { token = token });
}
客戶端
在客戶端,我配置了cookie身份驗證,它檢查用戶是否未通過身份驗證,它將用戶重定向到客戶端的登錄頁面
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.ExpireTimeSpan = TimeSpan.FromMinutes(20);
options.SlidingExpiration = true;
options.AccessDeniedPath = "/Error/Forbidden/";
options.LoginPath = "/home/login/";
});
在登錄頁面上,我要求用戶輸入他們的用戶名和密碼,然后在發出令牌的 Web API 專案中呼叫登錄端點。我成功獲得了令牌。
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://localhost:7157/");
HttpResponseMessage response = await client.GetAsync("WeatherForecast/login");
if (response.IsSuccessStatusCode)
{
var token= await response.Content.ReadFromJsonAsync<TokenModel>();
}
else
{
Console.WriteLine("Internal server Error");
}
}
現在,這就是我苦苦掙扎的地方。我想在客戶端使用此令牌登錄用戶,例如使用令牌生成 cookie 或使用 HttpContext.SignInAsync 登錄用戶。我有令牌,但不確定登錄用戶的最佳做法是什么或如何使用該令牌。
uj5u.com熱心網友回復:
如果您想要 cookie 身份驗證(如您在 MVC 專案中設定的那樣),您可以使用 ReadToken() 方法讀取令牌內的宣告,并生成 HttpContext.SignInAsync() 方法中所需的 ClaimsIdentity
var jsonToken = new JwtSecurityTokenHandler().ReadToken(token) as JwtSecurityToken;
var username = jsonToken.Claims.FirstOrDefault(m => m.Type == ClaimTypes.Name).Value;
.............
//add other logic
if (username==user.Name)
{
var claims = new Claim[]
{
new Claim(ClaimTypes.Name, user.Name),
};
var claimsIdentity = new ClaimsIdentity(claims);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity));
}
如果你想在你的 MVC 專案中進行 JWT 身份驗證,你可以設定如下:
services.AddAuthentication(options =>
{
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
......
};
options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Cookies["token"];
if (!string.IsNullOrEmpty(accessToken))
{
context.Token = accessToken;
}
return Task.CompletedTask;
}
};
在您的登錄控制器中添加令牌:
Response.Cookies.Append("token", token);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/496143.html
