За некоторое время, потраченное на исследования, я смог обнаружить, что лучшие практики - использовать существующую схему.Я не смог найти хороший пример пользовательской настройки, но большинство известных схем хорошо поддерживаются, поэтому я решил использовать аутентификацию JWT.Это очень похоже на то, что я хотел сделать изначально, генерируя случайный токен и используя его для доступа к привилегированному запросу.
Этот код работает для меня.Это очень простой пример, но он ясно показывает, как войти в систему и затем пройти аутентификацию в защищенном методе.
Вы захотите изменить закрытый ключ и иметь способ аутентификации ваших пользователей вместо статического жесткого кодапользователь проверяет, что я сделал ниже.
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("THIS_IS_YOUR_SECRET_KEY_CREATE_SOMETHING_RANDOMIZED_AND_COMPLICATED"))
};
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
//app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
HomeController.cs
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using coreapi.Models;
using Microsoft.AspNetCore.Authorization;
namespace coreapi.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
return Json(new ErrorViewModel());
}
[Authorize]
public IActionResult Secured()
{
ErrorViewModel model = new ErrorViewModel();
model.RequestId = "secured works";
return Json(model);
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return Json(new ErrorViewModel {RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier});
}
}
}
AuthController.cs
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using coreapi.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
namespace coreapi.Controllers
{
public class AuthController
{
[HttpPost]
public IActionResult Login([FromBody]LoginModel user)
{
if (user == null)
{
return new BadRequestObjectResult("Invalid client request");
}
if (user.EmailAddress == "bob@bobsburgers.com" && user.Password == "test123")
{
var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("THIS_IS_YOUR_SECRET_KEY_CREATE_SOMETHING_RANDOMIZED_AND_COMPLICATED"));
var signinCredentials = new SigningCredentials(secretKey, SecurityAlgorithms.HmacSha256);
// issuer and audience aren't currently being used
var tokeOptions = new JwtSecurityToken(
issuer: "https://localhost:8080",
audience: "https://localhost:8080",
claims: new List<Claim>(),
expires: DateTime.Now.AddMinutes(5),
signingCredentials: signinCredentials
);
var tokenString = new JwtSecurityTokenHandler().WriteToken(tokeOptions);
return new OkObjectResult(new { Token = tokenString });
}
else
{
return new UnauthorizedResult();
}
}
}
}
LoginModel.cs
namespace coreapi.Models
{
public class LoginModel
{
public string EmailAddress { get; set; }
public string Password { get; set; }
}
}