【问题标题】:OpenID Connect ASP NET MVC AADOpenID 连接 ASP NET MVC AAD
【发布时间】:2017-01-30 18:09:31
【问题描述】:

我使用 OpenID Connect 标准和 ASP NET MVC 网站实现了一个示例应用程序。我的目标是将敏感数据的存储外包给 Azure,所以我使用了 Azure Active Directory。由于不可能在 Azure 中向用户添加自定义属性,因此我将非敏感用户声明存储在我们的私有数据库中。我设法得到了这个声明并将它们“添加”到 cookie 中,如下所示:

new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,
                RedirectUri = postLogoutRedirectUri,
                Notifications = new OpenIdConnectAuthenticationNotifications
                {
                    AuthorizationCodeReceived = context =>
                    {
                        var objectId = context.AuthenticationTicket.Identity.Claims.First(x => x.Type == "http://schemas.microsoft.com/identity/claims/objectidentifier");
                        var claims = GetUserClaims(objectId.Value);
                        foreach (var item in claims)
                        {
                            context.AuthenticationTicket.Identity.AddClaim(new System.Security.Claims.Claim(item.Key, item.Value));
                        }
                        return Task.FromResult(0);
                    }
                }

通过这种方式,我在 cookie 中添加了必需的声明,因此这些声明在我的用户对象中一直存在,直到用户退出这很好,但有一个声明可以在会话期间更改(基本上用户可以在一页上更改它)。问题是我找不到如何在 cookie 中“更改”此声明,因此它会持续存在。理想情况下,我想以某种方式强制

已收到授权码

函数被再次调用。可能吗 ?还是有另一种方法可以交换存储在 cookie 中的值?

到目前为止,我唯一的解决方案是在用户更改此值时注销用户,这将迫使他再次注销,并且我的 AuthorizationCodeReceived 回调将再次被调用,但这不是一种非常用户友好的方式。

【问题讨论】:

    标签: asp.net-mvc azure-active-directory openid-connect


    【解决方案1】:

    在身份对象中添加声明后,您可以调用 HttpContext.GetOwinContext().Authentication.SignIn() 以将新声明保留在 cookie 中。

    【讨论】:

    • 会尽力让你知道的。
    • 我试过这个。它没有工作它没有调用 AuthorizationCodeReceived 但这工作: HttpContext.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
    • 用我的代码修改你的答案,我会把它标记为完成。有人会发现它很有用:)
    • @MajkeloDev 很高兴知道您能够解决问题。 Challange() 方法不一定会调用 AuthorizationCodeReceived(当请求已经具有有效的 ID 令牌时),并且仅在您从身份提供者(即 AAD)检索新令牌或更新令牌时才应调用它。建议您不要依赖于调用 AuthorizationCodeReceived。您可以创建一个通用方法来刷新声明,从 AuthorizationCodeReceived 或您需要的任何地方调用它。
    • 我在“AuthorizationCodeReceived”中执行此操作的原因是,如果我在不同的地方执行此操作...我无法更新 cookie,因此我添加给用户的声明不会持续存在 :(
    猜你喜欢
    • 2018-10-26
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多