因此,如果我对您的理解正确,您将希望利用.net core中的策略。
我正在尝试使用Windows身份验证作为唯一提供程序在IdentityServer4中实现用户模拟。
预期行为我希望我的管理员(某个AD组)能够登录(模拟)房屋中的另一个用户。此功能的目的是在投入生产时更好地调试潜在的错误。我们希望能够以特定用户身份登录,并准确查看他们看到的内容。
我在想以下内容:
/admin/impersonate
或系统将管理员重定向至该路径act
声明中添加管理员用户名(员工姓名缩写设置
// 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中的策略。