使用asp.net核心、Mvc和OpenIdConnect,是否有可能在ODIC身份验证过程中提示经过身份验证的用户提供其他信息,然后重定向到最初需要的页面?
给出一个具体的例子:在我们的系统中,一个人,代表一个电子邮件地址,可以有多个用户in,他们可能希望操作。假设我的电子邮件地址是tregan@domain.com,我有3个用户is可供选择: treganCat、treganDog、treganMouse。当我碰到一个带有授权属性装饰的Controller操作时,我首先要进行OpenIdConnect身份验证,返回的声明之一是一个电子邮件地址。
使用该电子邮件地址,我希望应用程序提示我选择要运行的标识(treganDog、treganCat或treganMouse)。
在那里,我希望应用程序获取我选择的用户id,查询数据库中与所选用户id一起的角色,并将这些角色作为声明加载到我的身份中。
最后,我希望应用程序将我发送到我想要的页面(这是我最初试图访问的受保护的Controller方法)。
这个是可能的吗?
我使用的是Owin类;下面的代码“工作”,除了从提示符中的虚构行"var identityGuid =返回值“之外(”虚构“,因为它代表了我想要发生的事情,但实际上需要一系列重定向)。
下面的示例使用OnTicketReceived事件,但是选择是任意的,我愿意在任何情况下这样做。
services.AddAuthentication(authenticationOptions =>
{
authenticationOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
authenticationOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(openIdConnectOptions =>
{
openIdConnectOptions.Authority = Configuration["PingOne:Authority"];
openIdConnectOptions.CallbackPath = "/Callback";
openIdConnectOptions.ClientId = Configuration["PingOne:ClientId"];
openIdConnectOptions.ClientSecret = Configuration["PingOne:ClientSecret"];
openIdConnectOptions.ResponseType = "code";
openIdConnectOptions.Events.OnTicketReceived = (ticketReceivedContext) =>
{
var emailClaim =
ticketReceivedContext.Principal.Claims.FirstOrDefault(o =>
o.Type == ClaimTypes.Email);
string emailAddress = emailClaim.Value;
//here is where I would like to prompt the user to select an identity based on the email address
//the selected identity is represented by a guid
var identityGuid = [return value from the prompt];
var roles = new MyRepository(myContext).GetRolesForUserId(identityGuid);
var claims = new List<Claim>();
foreach (string role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
ticketReceivedContext.Principal.AddIdentity(new ClaimsIdentity(claims));
return Task.CompletedTask;
};
}); 发布于 2019-12-17 19:57:16
我认为,如果不想出一种在PingOne中实现它的方法,或者编写自己的IdentityServer,并在那里处理额外的步骤,我就不可能做到这一点。
我决定编写一个自定义中间件,该中间件在身份验证中间件之后触发,正如在“所以问题”中所描述的那样:In asp.net core, why is await context.ChallengeAsync() not working as expected?
发布于 2019-11-27 19:44:59
这是模拟,在那里有一个真正的用户,您需要在登录后识别模拟用户。
您需要先完成登录,返回应用程序并配置主体。然后呈现一个UI并接收所选的选项。
然后,您需要您的UI调用后端,并告诉它更新auth cookie中的声明。但是不确定你是否能让它工作--模拟的用户可能需要单独的存储--比如第二个cookie。
这突出表明,将UI接收到的令牌/凭据从后端处理的声明中分离可能是有用的。
对于直接为UI提供服务的REST,我使用了下面的许多设计--尽管它可能对您的解决方案来说太过了:https://authguidance.com/2017/10/03/api-tokens-claims/
https://stackoverflow.com/questions/59002450
复制相似问题