Интегрированная проверка подлинности Windows в структуре ABP

Я пытаюсь использовать ABP с проверкой подлинности Windows, а не на основе таблиц.

Планируется, что каркас будет:

  1. Обнаружить, что веб-сайт находится в контексте безопасности Windows, и обойти страницу входа.
  2. Затем свяжите удостоверение / роли Windows и используйте их для сопоставления ролей / разрешений, определенных в базе данных.

Я не нашел в документации ничего об этом подходе, интегрированном с Windows.

Если кто-то делал это раньше, я ценю любые советы.

Я думаю, что лучше всего будет использовать авторизацию на основе политик. Поэтому, если контроллеры в настоящее время используют атрибуты аутентификации ABP, я вернусь к обычным атрибутам ASP.NET.

e.g. [Authorize(Policy = "MyAppAdmin")]


person Jazb    schedule 16.02.2018    source источник


Ответы (3)


Чтобы войти в систему через официальный API AspNet Boilerplate (чтобы иметь роли и другие вещи), вы можете использовать внешнюю аутентификацию. Это именно то, что вы ищете;

https://aspnetboilerplate.com/Pages/Documents/Zero/User-Management#external-authentication

person Alper Ebicoglu    schedule 19.02.2018
comment
Возможно, удастся даже отказаться от формы входа в интегрированном / аутентифицированном контексте Windows. Я не уверен, насколько это будет сложно ... - person Jazb; 19.02.2018

Я попытался сделать то, что предложил Джон, но мне пришлось внести несколько изменений, поэтому я сделал это так.

"angular \ src \ account \ login \ login.component.ts"

class LoginComponent {    
  ngOnInit() {
    this.loginService.authenticateModel.userNameOrEmailAddress = 'foo';
    this.loginService.authenticateModel.password = 'bar';
    this.login();
  }
}

"aspnet-core \ src \ ProjectName.Core \ Authentication \ AlwaysTrue \ AlwaysTrueExternalAuthSource.cs"

public class AlwaysTrueExternalAuthSource: DefaultExternalAuthenticationSource<Tenant, User>, ITransientDependency
{
  public override string Name => "AlwaysTrueExternalAuthSource";

  public override Task<bool> TryAuthenticateAsync(string userNameOrEmailAddress, string plainPassword, Tenant tenant)
  {
    return Task.FromResult(true);
  }
}

"aspnet-core \ src \ ProjectName.Core \ ProjectNameCoreModule.cs"

public class ProjectNameCoreModule : AbpModule
{
  public override void PreInitialize()
  {
    Configuration.Modules.Zero().UserManagement.ExternalAuthenticationSources.Add<AlwaysTrueExternalAuthSource>();
  }
}

"aspnet-core \ src \ ProjectName.Web.Core \ Controllers \ TokenAuthController.cs"

public class TokenAuthController : ProjectNameControllerBase
{
  [HttpPost]
  public async Task<AuthenticateResultModel> Authenticate([FromBody] AuthenticateModel model)
  {
    var windowsIdentity = WindowsIdentity.GetCurrent();
    model.UserNameOrEmailAddress = windowsIdentity.Name.ToLowerInvariant().Replace("\\","");

    var loginResult = await GetLoginResultAsync(...)
  }
}
person yohosuff    schedule 16.07.2018

в духе совместного использования вот как мне удалось обойти использование экрана входа в систему для контекста с проверкой подлинности Windows.

  1. сделайте панель входа в систему скрытой и установите некоторые фиктивные данные для элементов управления именем пользователя / паролем (фиктивные данные фактически не используются).
  2. в файле js немедленно запустите действие входа в систему (без взаимодействия с пользователем)

    abp.ajax({
        contentType: 'application/x-www-form-urlencoded',
        url: $loginForm.attr('action'),
        data: $loginForm.serialize()
    });
    
  3. В AccountController:

    var windowsIdentity = WindowsIdentity.GetCurrent();
    loginModel.UsernameOrEmailAddress = windowsIdentity.Name;
    
    var count = (from x in windowsIdentity.Claims where x.Value == "myclaim" select x).Count();
    
    if (count == 0)
    {
        throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(AbpLoginResultType.InvalidUserNameOrEmailAddress, loginModel.UsernameOrEmailAddress, null);
    }
    
  4. Create an ExternalAuthSource as described in the answer above. We will always return true becuase the real authentication is already done.
    public override Task<bool> TryAuthenticateAsync(string userNameOrEmailAddress, string plainPassword, Tenant tenant)
    {
        return Task.FromResult(true);
    }
    
    It has the added advantage that the authenticated user is created by the ABP Framework automatically. The Role the new user is assigned depends on the which role is the Default - see Table AbpUserRoles.

Надеюсь, это поможет кому-то, кто пытается использовать фреймворк в контексте с проверкой подлинности Windows.

person Jazb    schedule 20.02.2018
comment
Спасибо за ваш отзыв. как насчет входа вне интранет-сети. попробуйте войти в систему со своего мобильного телефона, чтобы увидеть, получите ли вы тот же результат. Я думаю, вы не можете получить WindowsIdentity.GetCurrent () - person Alper Ebicoglu; 20.02.2018
comment
если пользователь выходит из сети, его сеанс Windows завершается, а вместе с ним и веб-приложение (т. е. пользователь нажимает кнопку «выйти из системы» в меню «Пуск» Windows). Прямо сейчас у меня нет возможности войти в нашу сеть (внутреннюю сеть) с помощью мобильного устройства. - person Jazb; 20.02.2018