【问题标题】:ASP.NET Core "fake" Mixed AuthenticationASP.NET Core“假”混合身份验证
【发布时间】:2020-04-25 23:00:11
【问题描述】:

我想使用 ASP.NET Core 身份和个人用户帐户作为底层授权方法来实现“假”混合身份验证。

流程应该是这样的:

  1. 数据库用户表中填充了所有员工(即用户名是 John.Smith 或 Jane.Smith)
  2. 用户打开部署在 IIS 上并启用 Windows 身份验证的 Intranet 应用程序
  3. 用户在 AD 上通过身份验证,其用户名是 DOMAIN\John.Smith
  4. 系统使用 John.Smith 作为无密码登录名对数据库数据进行另一次身份验证
  5. 系统为 John.Smith 颁发新的身份验证票证,其中所有角色和声明均从数据库中提取

我被困在第 4 点,我应该在哪里进行“假”身份验证?

【问题讨论】:

  • “假”身份验证是什么意思? HTTP 请求的当前 HTTP 上下文中的用户已经通过您的 Active Directory 域的身份验证。听起来您需要另一个自定义中间件,该中间件将在身份验证后处理以执行您的自定义数据库相关逻辑。
  • 是的,这就是想法。这是一种伪造的混合身份验证,因为唯一启用的方法是 Windows 方法,其底层个人用户帐户身份验证逻辑对用户透明。
  • 我不完全确定,但我认为 IClaimsTransformer 是满足您要求的方法:benfoster.io/blog/…

标签: .net asp.net-core asp.net-identity windows-authentication mixed-authentication


【解决方案1】:

您不需要开始新的身份验证并发出新票证,您可以继续使用从 windows 身份验证验证的票证/原则,您可以使用IClaimsTransformation 将您当前的 windows 身份验证用户与本地数据库用户关联:

public class ClaimsTransformer : IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var id = ((ClaimsIdentity)principal.Identity);

        var ci = new ClaimsIdentity(id.Claims, id.AuthenticationType, id.NameClaimType, id.RoleClaimType);

        //read database and create/check a user in local database , add userID as claim in Principal
        if (....)
        {
            ci.AddClaim(new Claim("localUserID", "XXX"));
        }
        else
        {
            ci.AddClaim(new Claim("localUserID", "XXXX"));

        }


        var cp = new ClaimsPrincipal(ci);

        return Task.FromResult(cp);
    }
}

IClaimsTransformation中,在windows认证之后,你可以在你的数据库中使用windows用户的id/name检查/创建一个本地用户,将标识数据库中本地用户的id添加到ClaimsPrincipal,以便下次你可以使用该声明在执行用户管理时识别本地数据库用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2015-07-18
    • 2017-03-30
    相关资源
    最近更新 更多