Как ограничить внешний вход в учетную запись Microsoft списком писем или одним доменом в ASP.NET Core - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть веб-приложение, предназначенное для списка людей, которые используют Outlook в качестве поставщика электронной почты.Веб-приложение использует API-интерфейс внешнего входа Microsoft.Но любой, у кого есть учетная запись электронной почты Microsoft, может в данный момент войти в систему.

Я предполагаю, что это настройка приложения на портале Microsoft dev или переопределение каким-либо образом внутри кода.Как я могу отфильтровать домен приложения или иметь строгий список учетных записей, которые могут войти?

1 Ответ

0 голосов
/ 20 декабря 2018

AFAIK, у портала нет настроек для управления этим, поэтому временное решение может заключаться в ограничении типа учетной записи после перенаправления обратно на ваш клиент со страницы входа Microsoft.

Я предполагаю, что вы используете Microsoft.AspNetCore.Authentication.MicrosoftAccount:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/microsoft-logins?view=aspnetcore-2.2

Вы можете проверить, является ли учетная запись электронной почты учетной записью outlook в ExternalLoginCallback функции удостоверения ASP.NET:

[HttpGet]
[AllowAnonymous]
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null, string remoteError = null)
{
    if (remoteError != null)
    {
        ErrorMessage = $"Error from external provider: {remoteError}";
        return RedirectToAction(nameof(Login));
    }
    var info = await _signInManager.GetExternalLoginInfoAsync();

    var emailAddress = info.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email).Value;

    //Check whether this is outlook account .
    if (!"outlook.com".Equals(emailAddress.Split('@')[1]))
    {
        //return to error page and show error message 
    }
    if (info == null)
    {
        return RedirectToAction(nameof(Login));
    }


    // Sign in the user with this external login provider if the user already has a login.
    var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
    if (result.Succeeded)
    {
        _logger.LogInformation("User logged in with {Name} provider.", info.LoginProvider);
        return RedirectToLocal(returnUrl);
    }
    if (result.IsLockedOut)
    {
        return RedirectToAction(nameof(Lockout));
    }
    else
    {
        // If the user does not have an account, then ask the user to create an account.
        ViewData["ReturnUrl"] = returnUrl;
        ViewData["LoginProvider"] = info.LoginProvider;
        var email = info.Principal.FindFirstValue(ClaimTypes.Email);
        return View("ExternalLogin", new ExternalLoginViewModel { Email = email });
    }
}

Другим способом является проверкаOnCreatingTicket событие в промежуточном программном обеспечении, если входящий в систему пользователь не является учетной записью outlook, перенаправьте пользователя на страницу входа еще раз:

services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
    microsoftOptions.Events = new Microsoft.AspNetCore.Authentication.OAuth.OAuthEvents
    {
            OnCreatingTicket = ctx =>
        {
            var email = ctx.Identity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email);
            if (!"outlook.com".Equals(email.Value.Split('@')[1]))
            {
                ctx.Response.Redirect("/");

            }
            return Task.FromResult(0);
        }


    };
    microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ApplicationId"];
    microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:Password"];
});

Обновление:

Если вы создаете основное приложение .net с Individual User Accounts шаблон, который означает, что вы работаете с ASP.NET Identity:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.2&tabs=visual-studio

ASP.NET Core 2.1 и более поздних версий обеспечивает ASP.NET Core Identity в качестве библиотеки классов Razor.Вы можете удостоверение scaffold в проектах ASP.NET Core , чтобы изменить код и изменить поведение.Или вы можете попробовать второе решение выше для изменения промежуточного программного обеспечения OpenID Connect.

...