我使用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的回调,但它不是一个非常用户 - 友好的方式。
答案 0 :(得分:0)
在身份对象中添加声明后,可以调用HttpContext.GetOwinContext()。Authentication.SignIn()以在cookie中保留新声明。