У меня есть требование разрешить пользователям проходить аутентификацию либо с помощью единого входа, либо с помощью входа в систему с использованием удостоверения.
Я могу заставить оба варианта работать самостоятельно, но при попытке разрешить оба варианта я получаю следующее: p>
SSO работает должным образом, и пользователь аутентифицируется.
После успешного входа в систему с идентификацией пользователь перенаправляется, и статус аутентификации проверяется в контроллере, но это всегда ложь.
Я думаю, что program.cs может быть неправильным, вот он вместе с методом контроллера:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity.UI.Services;
using Serilog.Sinks.MSSqlServer;
using Serilog;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Authorization;
using System.IdentityModel.Tokens.Jwt;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.UI;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication;
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
// Configure database connection
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
// Configure Identity services
builder.Services.AddDefaultIdentity(options =>
{
options.SignIn.RequireConfirmedAccount = false; // Adjust according to your needs
})
.AddRoles()
.AddEntityFrameworkStores();
// Configure OpenID Connect Authentication
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; // Use cookies by default
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; // Challenge with OpenID Connect
})
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
builder.Services.Configure(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Cookie.SameSite = SameSiteMode.Lax;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.HttpOnly = false;
});
// Configure logging
Log.Logger = new LoggerConfiguration()
.WriteTo.MSSqlServer(
connectionString: builder.Configuration.GetConnectionString("DefaultConnection"),
sinkOptions: new MSSqlServerSinkOptions
{
TableName = "Logs",
AutoCreateSqlTable = true
},
restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Information,
columnOptions: new ColumnOptions())
.CreateLogger();
builder.Host.UseSerilog();
// Add services and Razor Pages
builder.Services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
builder.Services.AddRazorPages()
.AddMicrosoftIdentityUI();
builder.Services.AddHttpContextAccessor();
// Configure CORS policy
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll", builder =>
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});
// Register other application services
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.Configure(builder.Configuration.GetSection("SmtpSettings"));
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
var app = builder.Build();
// Configure the HTTP request pipeline
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
// Set IronPdf license key
var provider = app.Services;
var configuration = provider.GetRequiredService();
IronPdf.License.LicenseKey = configuration.GetSection("Keys").GetValue("IronPdf.LicenseKey");
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseFileServer();
app.UseRouting();
app.UseCors("AllowAll");
app.UseAuthentication();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
app.UseStatusCodePagesWithRedirects("/Error/{0}");
app.Run();
Метод входа пользователя:
[HttpPost]
[AllowAnonymous]
[Route("LoginUser")]
public async Task LoginUser(LoginModel model, string returnUrl = null)
{
try
{
Log.Information("Login attempted: " + model.Email);
ViewData["ReturnUrl"] = returnUrl;
var result = await signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
Log.Information("Successful Identity login: " + User.Identity.Name);
return Ok(new { message = "Success", redirectUrl = Url.Action("Home", "Accounts") });
}
else
{
Log.Error("Invalid login: " + model.Email);
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return BadRequest(new { message = "Unsuccessful" });
}
}
catch (Exception ex)
{
Log.Error("Error on login: " + model.Email + " " + ex.Message);
ModelState.AddModelError(string.Empty, "Error login attempt.");
return BadRequest(new { message = ex.Message });
}
}
Это успешно, когда я ставлю точку останова if (result.Succeeded)
И метод контроллера, на который мы перенаправляемся не проходит аутентификацию:
[Route("/accounts/home")]
public IActionResult Home()
{
if (User.Identity.IsAuthenticated)
{
return View();
}
return RedirectToAction("Login", "Home");
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... dentity-al
Пользователь всегда не проходит аутентификацию после успешного входа в систему при использовании Identity вместе с SSO. ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
После успешного входа в систему пользователь не может быть прочитан из сеанса Symfony.
Anonymous » » в форуме Php - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-