首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提示用户在打开Id连接事件期间提供其他信息?

提示用户在打开Id连接事件期间提供其他信息?
EN

Stack Overflow用户
提问于 2019-11-22 22:14:55
回答 2查看 508关注 0票数 3

使用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事件,但是选择是任意的,我愿意在任何情况下这样做。

代码语言:javascript
复制
        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;
                };

            }); 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-17 19:57:16

我认为,如果不想出一种在PingOne中实现它的方法,或者编写自己的IdentityServer,并在那里处理额外的步骤,我就不可能做到这一点。

我决定编写一个自定义中间件,该中间件在身份验证中间件之后触发,正如在“所以问题”中所描述的那样:In asp.net core, why is await context.ChallengeAsync() not working as expected?

票数 0
EN

Stack Overflow用户

发布于 2019-11-27 19:44:59

这是模拟,在那里有一个真正的用户,您需要在登录后识别模拟用户。

您需要先完成登录,返回应用程序并配置主体。然后呈现一个UI并接收所选的选项。

然后,您需要您的UI调用后端,并告诉它更新auth cookie中的声明。但是不确定你是否能让它工作--模拟的用户可能需要单独的存储--比如第二个cookie。

这突出表明,将UI接收到的令牌/凭据从后端处理的声明中分离可能是有用的。

对于直接为UI提供服务的REST,我使用了下面的许多设计--尽管它可能对您的解决方案来说太过了:https://authguidance.com/2017/10/03/api-tokens-claims/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59002450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档