.NET 8 Исключение проверки подлинности Facebook – перенаправление после вызова?C#

Место общения программистов C#
Ответить
Anonymous
 .NET 8 Исключение проверки подлинности Facebook – перенаправление после вызова?

Сообщение Anonymous »

Контекст:
Я разрабатываю WEB API в .NET 8 с аутентификацией Facebook с использованием ядра идентификации .net 8
Желаемое поведение :
Мне нужен API, чтобы предоставить конечную точку Get и запустить поток аутентификации Facebook при достижении конечной точки.
Проблема
  • Когда я выполняю запрос на получение в браузере по заданному маршруту, я получаю сообщение «
    Выдается исключение InvalidOperationException, сообщающее, что ответ уже получен
    началось при попытке установить заголовок перенаправления после вызова
    Challenge().
  • Это исключение происходит сразу после того, как пользователь ответил на запрос, но до того, как приложение Facebook перенаправит на мой маршрут обратного вызова.
  • Я попытался выполнить отладку шаг за шагом, чтобы подтвердить это.
  • Я попробовал несколько маршрутов обратного вызова в своем приложении Facebook.
Заключение
Я не знаю, ожидается ли такой поток для .NET API, но, похоже, у него возникли проблемы с настройкой моего ответ. Спасибо. Я искал это в Интернете и, похоже, не нашел ответа.
Program.cs

Код: Выделить всё

using emps.DTO;
using emps.Models;
using emps.Repository;
using emps.Services;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.Facebook;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Filters;

var builder = WebApplication.CreateBuilder(args);

// CORS CONFIGURATION
builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
builder.Services.AddCors(options => {
options.AddPolicy("debug", cors => {
cors.AllowAnyMethod();
cors.AllowCredentials();
cors.AllowAnyHeader();
cors.WithOrigins("https://localhost:3000");

});
});
builder.Services.Configure(builder.Configuration.GetSection(""));
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();

//IDENTITY CONFIGURATION
builder.Services.Configure(options =>
{
options.User.RequireUniqueEmail = true;
options.Password.RequireNonAlphanumeric = false;
options.Lockout.AllowedForNewUsers = true;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
options.Lockout.MaxFailedAccessAttempts = 5;
});

builder.Services.AddAuthentication(options =>{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = FacebookDefaults.AuthenticationScheme;
}).AddFacebook(options => {
options.AppId = builder.Configuration["appId"] ?? "";
options.AppSecret = builder.Configuration["appSecret"] ?? "";
options.CallbackPath = "/api/Auth/cb";
options.Scope.Add("pages_manage_engagement");
options.Scope.Add("pages_manage_posts");
options.Scope.Add("pages_read_engagement");
options.Scope.Add("publish_video");
options.Scope.Add("public_profile");
options.Scope.Add("email");
options.Fields.Add("email");
options.Fields.Add("name");
});
//COOKIE CONFIGURATION
builder.Services.ConfigureApplicationCookie(options => {
options.Cookie.Name = "mytoken";
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
options.SlidingExpiration = true;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
options.Cookie.SameSite = SameSiteMode.Lax;
});

builder.Services.AddIdentityApiEndpoints().AddEntityFrameworkStores();
//SWAGGER Configuration

builder.Services.AddSwaggerGen(options =>
{
options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Name = "Authorization",
Type = SecuritySchemeType.ApiKey

});
options.OperationFilter();

});
// DB Context
builder.Services.AddDbContext(options => {
options.UseSqlServer(builder.Configuration.GetConnectionString("defaultConnection"));
});

//Repositorios

builder.Services.AddScoped();
builder.Services.AddScoped();
//Servicios
builder.Services.AddScoped();
builder.Services.AddScoped();
//builder.Services.AddHttpClient();
builder.Services.AddScoped();
builder.Services.AddAuthorization();
var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.MapIdentityApi();

app.UseCors((options) =>  {
options.AllowAnyHeader();
options.AllowCredentials();
options.AllowAnyMethod();
options.AllowAnyHeader();
options.SetIsOriginAllowedToAllowWildcardSubdomains();
options.WithOrigins(["https://localhost:3000", "https://web.facebook.com"]);
});
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();

Маршруты контроллера

Код: Выделить всё

        public async Task< IActionResult> FacebookLogin() {
var properties = this.SignInManager.ConfigureExternalAuthenticationProperties("Facebook", null);
properties.RedirectUri = Url.Action("FacebookCb", "Auth");
return Challenge(properties,"Facebook");

}
[HttpGet("cb")]
public async Task FacebookCb(string code)
{

Console.WriteLine(code);
var response = await this.SignInManager.GetExternalLoginInfoAsync();
if (response != null)
{
var email = response.Principal.FindFirst(x => x.Type == ClaimTypes.Email);
var username = response.Principal.FindFirst(x => x.Type == ClaimTypes.Name);
if (email != null && username != null)
{
User userData = new User { Email = email.Value, UserName = username.Value };
await SignInManager.SignInAsync(userData, true);
var myUser = await this._service.GetUser(email.Value);
if (myUser != null)
{
if (response != null && response.AuthenticationTokens != null)
{
var token = response.AuthenticationTokens.FirstOrDefault(e => e.Name == "access_token");
}
}

}
}
return NoContent();

}

Код: Выделить всё

System.InvalidOperationException: StatusCode cannot be set because the response has already started.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ThrowResponseAlreadyStartedException(String value)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.set_StatusCode(Int32 value)
at Microsoft.AspNetCore.Http.DefaultHttpResponse.Redirect(String location, Boolean permanent)
at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
at Microsoft.WebTools.BrowserLink.Net.BrowserLinkMiddleware.InvokeAsync(HttpContext context)
at Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware.InvokeAsync(HttpContext context)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Спасибо за уделенное время. Надеюсь, мой вопрос достаточно ясен.


Подробнее здесь: https://stackoverflow.com/questions/790 ... -challenge
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»