Identity Server 4 在 UI 身份验证后添加声明
Identity Server 4 Adding claims after authentication from a UI
我正在 MVC 核心应用程序中实施 Identity Server 4。我有 Azure Active Directory 作为外部提供者,到目前为止一切正常。我还实现了 QuickStart UI(根据 https://github.com/IdentityServer/IdentityServer4.Quickstart.UI#quickstart-ui-for-identityserver4)
我想在此过程中添加一个步骤,在重定向回客户端之前,用户界面会向 select 提供一个选项列表,结果是将其添加为声明然后在客户端可用。我看到的方式是推迟在 ExternalController (https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/main/Quickstart/Account/ExternalController.cs)
中第 143 行发生的重定向
我已尝试重定向到自定义操作并接受用户输入,如下所示:
[HttpGet]
public async Task<IActionResult> MakeAChoice(string returnUrl)
{
//simple view model to maintain the returnUrl
var vm = BuildMakeAChoiceViewModel(returnUrl);
return View(vm);
}
[HttpPost]
public async Task<IActionResult> MakeAChoice(MakeAChoiceViewModel model, string choice)
{
//method one:
HttpContext.User.Claims.Append(new Claim("chosen_value", choice));
//method two:
HttpContext.User.Identities.FirstOrDefault().AddClaim(new Claim("chosen_value", choice));
return Redirect(model.ReturnUrl);
}
重定向工作得很好,所以我能够中断整个过程并仍然完成链和 return 到客户端应用程序没有问题。遗憾的是,此声明并未返回给客户。
需要这个 UI 驱动步骤的原因是,实施了 Identity Server 的应用程序包含自己的数据库,其中包含应用程序所需的详细信息,但只有那些可以先通过 Azure 进行身份验证的人才能访问。此附加索赔的数据也可能发生很大变化,这就是为什么用户在此处的选择很重要。
编辑:提供的答案让我克服了这一障碍,不幸的是我仍然无法在客户端中检索自定义声明。事实证明,从 .net core 2.0 开始,大多数声明类型都被自动剥离以节省膨胀。您必须在客户端的 OpenID Connect 设置中专门映射您想要的那些。请参阅此主题:https://github.com/aspnet/Security/issues/1449
就像你在这里做的那样操纵当前用户:
HttpContext.User.Identities.FirstOrDefault().AddClaim(new Claim("chosen_value", choice));
不会影响登录用户或其 token/cookies。您需要在调用之前添加您自己的声明:
await HttpContext.SignInAsync(isuser, props);
作为替代方案,如果您要添加的声明是特定于一个或几个客户的,您可以通过添加自己的 OnTicketReceived 事件处理程序来完成此客户端,例如:
options.Events = new OpenIdConnectEvents
{
OnTicketReceived = e =>
{
if (!e.Principal.HasClaim(c => c.Type == "bonuslevel"))
{
//Lookup bonus level.....
e.Principal.Identities.First().AddClaim(new Claim("bonuslevel", "12345"));
}
return Task.CompletedTask;
}
};
我正在 MVC 核心应用程序中实施 Identity Server 4。我有 Azure Active Directory 作为外部提供者,到目前为止一切正常。我还实现了 QuickStart UI(根据 https://github.com/IdentityServer/IdentityServer4.Quickstart.UI#quickstart-ui-for-identityserver4)
我想在此过程中添加一个步骤,在重定向回客户端之前,用户界面会向 select 提供一个选项列表,结果是将其添加为声明然后在客户端可用。我看到的方式是推迟在 ExternalController (https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/main/Quickstart/Account/ExternalController.cs)
中第 143 行发生的重定向我已尝试重定向到自定义操作并接受用户输入,如下所示:
[HttpGet]
public async Task<IActionResult> MakeAChoice(string returnUrl)
{
//simple view model to maintain the returnUrl
var vm = BuildMakeAChoiceViewModel(returnUrl);
return View(vm);
}
[HttpPost]
public async Task<IActionResult> MakeAChoice(MakeAChoiceViewModel model, string choice)
{
//method one:
HttpContext.User.Claims.Append(new Claim("chosen_value", choice));
//method two:
HttpContext.User.Identities.FirstOrDefault().AddClaim(new Claim("chosen_value", choice));
return Redirect(model.ReturnUrl);
}
重定向工作得很好,所以我能够中断整个过程并仍然完成链和 return 到客户端应用程序没有问题。遗憾的是,此声明并未返回给客户。
需要这个 UI 驱动步骤的原因是,实施了 Identity Server 的应用程序包含自己的数据库,其中包含应用程序所需的详细信息,但只有那些可以先通过 Azure 进行身份验证的人才能访问。此附加索赔的数据也可能发生很大变化,这就是为什么用户在此处的选择很重要。
编辑:提供的答案让我克服了这一障碍,不幸的是我仍然无法在客户端中检索自定义声明。事实证明,从 .net core 2.0 开始,大多数声明类型都被自动剥离以节省膨胀。您必须在客户端的 OpenID Connect 设置中专门映射您想要的那些。请参阅此主题:https://github.com/aspnet/Security/issues/1449
就像你在这里做的那样操纵当前用户:
HttpContext.User.Identities.FirstOrDefault().AddClaim(new Claim("chosen_value", choice));
不会影响登录用户或其 token/cookies。您需要在调用之前添加您自己的声明:
await HttpContext.SignInAsync(isuser, props);
作为替代方案,如果您要添加的声明是特定于一个或几个客户的,您可以通过添加自己的 OnTicketReceived 事件处理程序来完成此客户端,例如:
options.Events = new OpenIdConnectEvents
{
OnTicketReceived = e =>
{
if (!e.Principal.HasClaim(c => c.Type == "bonuslevel"))
{
//Lookup bonus level.....
e.Principal.Identities.First().AddClaim(new Claim("bonuslevel", "12345"));
}
return Task.CompletedTask;
}
};