OpenID Connect ASP NET MVC AAD

时间:2016-09-22 08:50:08

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

我使用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添加了所​​需的声明,因此这些声明会一直存在于我的User对象中,直到用户退出,这很好,但有一个声明可以在会话期间更改(基本上用户可以在一个页面上更改)。问题是我无法找到如何改变"这个声明在cookie中,所以它会持续存在。理想情况下,我想以某种方式强迫

  

AuthorizationCodeReceived

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

到目前为止,我唯一的解决方案是在更改此值时注销用户,这样会强制他再次注销,并且我将再次调用AuthorizationCodeReceived的回调,但它不是一个非常用户 - 友好的方式。

1 个答案:

答案 0 :(得分:0)

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