使用OAuth和OIDC进行用户模拟

问题描述 投票:0回答:1

我正在尝试使用Windows身份验证作为唯一提供程序在IdentityServer4中实现用户模拟。

预期行为我希望我的管理员(某个AD组)能够登录(模拟)房屋中的另一个用户。此功能的目的是在投入生产时更好地调试潜在的错误。我们希望能够以特定用户身份登录,并准确查看他们看到的内容。

我在想以下内容:

  1. 管理员直接导航至路径/admin/impersonate或系统将管理员重定向至该路径
  2. 路由检查输入此路由的用户是否确实具有必要的特权(是所需AD组的用户部分]
  3. 如果是,则管理员输入要模拟的用户的用户名(员工姓名缩写)>
  4. 管理员提交表单
  5. 授权服务器为模拟用户生成令牌,并在act声明中添加管理员用户名(员工姓名缩写
  6. ]
  7. 如果有返回URL,请返回该URL,否则返回IDS4的首页
  8. 设置

到目前为止,我已经设置了IdentityServer4并实现了Windows身份验证提供程序,如下所示:
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    //...

    services.Configure<IISServerOptions>(iis =>
    {
        iis.AuthenticationDisplayName = "Windows";
        iis.AutomaticAuthentication = false;
    });

    services.AddIdentityServer()
        .AddInMemoryIdentityResources(Configuration.GetSection("Config:IdentityResources"))
        .AddInMemoryApiResources(Configuration.GetSection("Config:ApiResources"))
        .AddInMemoryClients(Configuration.GetSection("Config:Clients"))
        .AddDeveloperSigningCredentials();

    //...
}

所有其他内容都是IDS4的Quickstart UI示例中的基本设置,除了我告诉IDS4不要包括Windows组,因为我们有很多方法可以将它们放入JWT中。

进度

我添加了必要的控制器AdminController并创建了动作Impersonate()以及表单Impersonate(ImpersonationViewModel vm)的HttpPost。视图模型如下所示:
//ImpersonationViewModel.cs
public class ImpersonationViewModel
{
    public string ReturnUrl { get; set; }
    public string UserInitials { get; set; }
}

我已经非常简单地建立了自己的观点,例如:

@model IdentityServer.Quickstart.Account.ImpersonationViewModel

<div class="login-page">
    <div class="page-header">
        <h1>Impersonation</h1>
    </div>

    <partial name="_ValidationSummary" />

    <div class="row">
        <form asp-route="Impersonate">
            <input type="hidden" asp-for="ReturnUrl" />

            <fieldset>
                <div class="form-group">
                    <label asp-for="UserInitials"></label>
                    <input class="form-control" placeholder="Medarbejder initialer" asp-for="UserInitials" autofocus />
                </div>

                <div class="form-group">
                    <button class="btn btn-primary" name="button" value="login">Log ind</button>
                    <button class="btn btn-default" name="button" value="cancel">Annuller</button>
                </div>
            </fieldset>
        </form>
    </div>
</div>

管理员所需要做的就是输入他们要模拟的用户名(员工姓名缩写

)。>

问题这是我对实现有些迷惑的地方。首先,我发现很难真正验证击中/admin/impersonate路线的用户是否在必需的AD组中。

[当用户以如下方式登录adm时,我尝试将自定义声明ExternalController.ProcessWindowsLoginAsync(string returnUrl)添加到声明身份:

//ExternalController.cs
private async Task<IActionResult> ProcessWindowsLoginAsync(string returnUrl)
{
    //...

    var id = new ClaimsIdentity(AccountOptions.WindowsAuthenticationSchemeName);
    id.AddClaim(new Claim(JwtClaimTypes.Subject, wp.FindFirst(ClaimTypes.PrimarySid).Value));
    id.AddClaim(new Claim(JwtClaimTypes.Name, wp.Identity.Name));
    id.AddClaim(new Claim("adm", wp.IsInRole("Some-Admin-Group-Name").ToString()));

    //...
}

然后在AdminController.Impersonate()方法中提取此值,如下所示:

//AdminController.cs
[HttpGet]
public IActionREsult Impersonate()
{
    var admClaim = User.Claims.FirstOrDefault(c => c.Type.Equals("adm"))?.Value;

    //...
}

但是,此声明不属于我的用户主体,因此不会起作用。

现在如何

这基本上是我已经走了多远。我了解使用act声明进行假冒的主要思想,但发现IDS4很难实现。我想我缺乏OAuth和OIDC的知识,但是谁不知道。对于新手来说这是一个复杂的协议,因此我的问题是:)

我希望你们中的一些可以帮助我:)

我正在尝试使用Windows身份验证作为唯一的提供程序在IdentityServer4中实现用户模拟。预期的行为我希望我的管理员(某个AD组)能够... ...>

因此,如果我对您的理解正确,您将希望利用.net core中的策略。

例如,在您的创业公司中,您会遇到类似这样的事情:

Startup.cs

services.ConfigureAuthorization();

ServiceExtensions.cs

public static void ConfigureAuthorization(this IServiceCollection services)
{
     services.AddAuthorization(options =>
     {
          options.AddPolicy("AdminRole", policy =>
          {
               policy.RequireRole("Whatever is in your claims identity");
          }
     }
}

然后用类似的东西装饰您的控制器

[HttpGet]
[Authorize(Policy = "AdminRole")]
public IActionREsult Impersonate()
{
    var admClaim = User.Claims.FirstOrDefault(c => c.Type.Equals("adm"))?.Value;

    //...
}
.net-core oauth-2.0 identityserver4 openid-connect
1个回答
0
投票

因此,如果我对您的理解正确,您将希望利用.net core中的策略。

© www.soinside.com 2019 - 2024. All rights reserved.