ABP框架中的集成Windows身份验证

时间:2018-02-16 06:03:06

标签: asp.net-core windows-authentication aspnetboilerplate

我正在尝试将ABP用于Windows身份验证而不是基于表的身份验证。

计划是建立框架:

  1. 检测到网站处于Windows安全上下文并绕过 登录页面。
  2. 然后关联Windows身份/角色并使用它们映射 数据库中定义的角色/权限。
  3. 我没有在文档中看到有关这种Windows集成方法的任何内容。

    如果有人以前这样做了,我会感激任何提示。

    我认为我最好的选择是使用基于策略的授权。所以当控制器当前使用ABP auth属性时,我将恢复到正常的ASP.NET属性。

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

3 个答案:

答案 0 :(得分:2)

要通过官方AspNet Boilerplate API登录用户(有角色和其他内容),您可以使用外部身份验证。这正是你要找的东西;

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

答案 1 :(得分:1)

我试图按照约翰的建议去做,但是我必须做一些改动,所以这就是我的做法。

“ 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(...)
  }
}

答案 2 :(得分:0)

本着分享的精神,我设法绕过了Window Authenticated上下文的登录界面。

  1. 隐藏“登录”面板并在用户名/密码控件上设置一些虚拟数据(实际上未使用虚拟数据)。
  2. js文件中的
  3. 立即运行登录操作(无用户交互)

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

  4. 在AccountController中:

  5. var windowsIdentity = WindowsIdentity.GetCurrent(); loginModel.UsernameOrEmailAddress = windowsIdentity.Name;

    var count =(来自windowsIdentity.Claims中的x,其中x.Value ==“myclaim”选择x).Count();

    if (count == 0)
    {
        throw _abpLoginResultTypeHelper.CreateExceptionForFailedLoginAttempt(AbpLoginResultType.InvalidUserNameOrEmailAddress, loginModel.UsernameOrEmailAddress, null);
    }
    
    1. 按照上面的答案中的说明创建一个ExternalAuthSource。我们将始终返回true,因为已经完成了真正的身份验证。

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

      它具有额外的优势,即经过身份验证的用户是由Apb框架自动创建的。新用户的角色取决于Default所属的角色 - 请参阅表AbpUserRoles

    2. 希望这有助于某人尝试在Windows身份验证的上下文中使用该框架。