Я использую .NET 10 с самыми последними обновлениями для всего. Я в ЭФ. Я ASP.NET Core. Ниже приведен мой файл program.cs. Внутри файла program.cs, когда я звоню, чтобы получить строку подключения, я получаю то, что ожидал. Когда я нажимаю LoginController, я вижу настройки в IConfiguration, которые были переданы. Однако, когда я устанавливаю точку останова в конструкторе FSMUserStore, я проверяю переданный контекст, и его строка подключения установлена неправильно (вообще). Я столько раз запускал отладчик Visual Studio и пробовал столько всего, что просто потерялся в этом. У кого-нибудь есть предложения?
using ElmahCore.Mvc;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Portal.Libraries;
using PortalDataModels.Models;
using System.Text;
using Twilio.TwiML.Voice;
var builder = WebApplication.CreateBuilder(args);
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
var connString = configuration.GetConnectionString("DefaultConnection");
// Add services to the container.
// For Entity Framework
builder.Services.AddDbContext
(options => options.UseSqlServer(configuration.GetConnectionString(connString)));
builder.Services.AddScoped();
builder.Services.AddIdentity()
.AddEntityFrameworkStores()
.AddUserManager()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddElmah(options => {
options.ConnectionString = connString;
options.SqlServerDatabaseTableName = "Elmah_Error"; //Defaults to ELMAH_Error if not set
options.OnPermissionCheck = context => false;
});
// Adding Authentication
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
// Adding Jwt Bearer
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.MapInboundClaims = false;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = configuration["Jwt:ValidAudience"],
ValidIssuer = configuration["Jwt:ValidIssuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:Key"]))
};
});
builder.Services.AddScoped();
builder.Services.AddElmah(options =>
{
options.ConnectionString = connString;
options.SqlServerDatabaseTableName = "Elmah_Error"; //Defaults to ELMAH_Error if not set
options.OnPermissionCheck = context => false;
});
builder.Services.AddControllers();
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Файл LoginController.cs:
[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class LoginController : ControllerBase
{
private readonly SignInManager _signInManager;
private readonly UserManager _userManager;
private readonly RoleManager _roleManager;
private readonly IConfiguration _configuration;
public LoginController(
SignInManager signInManager,
UserManager userManager,
RoleManager roleManager,
IConfiguration configuration)
{
_signInManager = signInManager;
_userManager = userManager;
_roleManager = roleManager;
_configuration = configuration;
}
[HttpPost]
public async Task Login([FromBody] Login model)
{
var user = await _userManager.FindByNameAsync(model.Username);
if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
{
//var userRoles = await _userManager.GetRolesAsync(user);
var authClaims = new List
{
new Claim(ClaimTypes.Name, user.UserName.Trim()),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
};
//authClaims.Add(new Claim("UserId", user.Id));
var token = GetToken(authClaims);
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token),
expiration = token.ValidTo,
Id = user.Id.Trim(),
});
}
return Unauthorized();
}
private JwtSecurityToken GetToken(List authClaims)
{
var authSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(s: _configuration["Jwt:Key"]));
var token = new JwtSecurityToken(
issuer: _configuration["Jwt:ValidIssuer"],
audience: _configuration["Jwt:ValidAudience"],
expires: DateTime.Now.AddYears(30),
claims: authClaims,
signingCredentials: new SigningCredentials(authSigningKey, SecurityAlgorithms.HmacSha256)
);
return token;
}
}
Файл FSMUserStore.cs:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using PortalDataModels.Models;
using System.Data.Common;
using System.Data.SqlClient;
namespace Portal.Libraries
{
public class FSMUserStore : IUserStore,
IUserPasswordStore
{
private bool disposedValue;
private POA_CSMContext _ctx;
public FSMUserStore(POA_CSMContext ctx)
{
_ctx = ctx; //