Я пытаюсь настроить свое серверное веб-приложение для входа с использованием внешнего поставщика входа в систему (в данном случае Discord). Я использую https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers для моих провайдеров oauth. Стоит отметить, что это приложение предназначено для только использования внешнего поставщика Discord, нет регулярной функции входа в систему с использованием имени пользователя / пароля.
Это то, что у меня есть в моем автозагрузке. Метод cs ConfigureServices для настройки аутентификации, авторизации и диссонанса oauth middleware:
services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
options.Password.RequireDigit = false;
options.Password.RequiredLength = 4;
options.Password.RequiredUniqueChars = 0;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireLowercase = false;
options.Password.RequireUppercase = false;
options.Lockout.AllowedForNewUsers = false;
}).AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthorization();
services.AddAuthentication().AddDiscord(x =>
{
x.ClientId = Configuration["AppId"];
x.ClientSecret = Configuration["AppSecret"];
x.Scope.Add("guilds");
x.Scope.Add("identify");
x.Validate();
});
, и это то, что у меня есть в моем методе Configure
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// environment stuff
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
}
По любой причине, когда я выполняювыполнить вызов (который успешно перенаправляет на вход в систему с диска, который затем перенаправляет обратно на / sigin-discord), он не входит в систему пользователя.
Это мой контроллер идентификации, который обрабатывает вход в систему, после того, как вызов произошел, пользователь отправляется на / sigin-discord, который затем перенаправляет на / sigin, чтобы либо войти в систему пользователя, либо создать учетную запись. для них, если они еще не имеют.
[HttpGet("login")]
public async Task login(string redirectUrl)
{
string redirectUri = Url.Action("ExternalLoginCallback","Identity",new { returnUrl = redirectUrl});
var properties = await signInManager.GetExternalAuthenticationSchemesAsync();
await HttpContext.ChallengeAsync(properties.FirstOrDefault().Name, new AuthenticationProperties { RedirectUri = redirectUri });
}
[HttpGet("signin")]
public async Task ExternalLoginCallback(string returnUrl)
{
returnUrl = returnUrl ?? "/";
var info = await signInManager.GetExternalLoginInfoAsync();
if (info == null)
{
HttpContext.Response.Redirect(returnUrl);
}
var result = await signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, true);
if (result.Succeeded)
{
HttpContext.Response.Redirect(returnUrl);
}
else
{
var username = info.Principal.FindFirstValue(ClaimTypes.Name);
if (username != null)
{
var user = await UserManager.FindByNameAsync(info.Principal.Identity.Name);
if (user == null)
{
user = new ApplicationUser(info.Principal.FindFirstValue(ClaimTypes.Name), Convert.ToUInt64(info.ProviderKey));
await UserManager.CreateAsync(user);
}
await UserManager.AddLoginAsync(user, info);
await signInManager.SignInAsync(user, true);
}
HttpContext.Response.Redirect(returnUrl);
}
Однако. SignInManager.GetExternalLoginInfoAsync () всегда возвращает значение NULL, даже если я успешно выполнил задание.
Кто-нибудь еще пытался использовать внешний поставщик для входа в систему с Blazor? Если так, у кого-нибудь есть идея, почему это не работает?