C# 其中是使用CookieAuthenticationProvider调用AuthenticationManager.SignIn()后存储的索赔实体信息

C# 其中是使用CookieAuthenticationProvider调用AuthenticationManager.SignIn()后存储的索赔实体信息,c#,asp.net-mvc-5,authorization,claims-based-identity,asp.net-authorization,C#,Asp.net Mvc 5,Authorization,Claims Based Identity,Asp.net Authorization,我们正在ASP.Net MVC web应用程序中使用Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider “登录”代码使用一个自定义类来跟踪授权信息(userRights,在下面的示例中)。代码如下所示: string auth = JsonConvert.SerializeObject(userRights); ClaimsIdentity identity = new ClaimsIdentity(new[] { n

我们正在ASP.Net MVC web应用程序中使用
Microsoft.Owin.Security.Cookies.CookieAuthenticationProvider

“登录”代码使用一个自定义类来跟踪授权信息(
userRights
,在下面的示例中)。代码如下所示:

string auth = JsonConvert.SerializeObject(userRights);
ClaimsIdentity identity = new ClaimsIdentity(new[]
{
    new Claim(ClaimTypes.AuthorizationDecision, auth),
}, DefaultAuthenticationTypes.ApplicationCookie);

AuthenticationManager.SignIn(identity);
Session.Add("AuthorizationDecision", userRights);
我担心的是,这些信息可能存储在身份验证cookie中,并发送到客户端,在那里可能会被操纵或更改

源代码在隐藏发生的事情方面做得很好。在VisualStudio中,“转到实现”表示找不到
IAAuthenticationManager.SignIn的任何实现以及
Microsoft.Owin.Security.Cookies.Cookie的源代码。CookieAuthenticationProvider
只显示了一组
操作
委托,因为我没有符号,所以无法调试这些委托

另一个问题是。我正在考虑通过如下方式使用会话存储来解决这两个潜在问题:

string auth = JsonConvert.SerializeObject(userRights);
ClaimsIdentity identity = new ClaimsIdentity(new[]
{
    new Claim(ClaimTypes.AuthorizationDecision, auth),
}, DefaultAuthenticationTypes.ApplicationCookie);

AuthenticationManager.SignIn(identity);
Session.Add("AuthorizationDecision", userRights);
在注销时:

Session.Clear();
Session.Abandon();
AuthenticationManager.SignOut();
通过这种方式,我可以确保信息不会发送给客户,也不能在那里进行操作。但我可能忽略了一些事情,或者我最初的担忧可能没有任何理由(由于代码模糊,我无法检查)。我们的团队担心“该会话不是为了授权而进行的,可能没有加密,或者不如使用声明那样安全”。如果各位专家能够分享您的想法,或者通过解释声明的存储位置来缓解我的担忧,那就太好了

--编辑--


我继续从身份验证声明中删除了授权(因为似乎没有人知道信息保存在哪里)。它可以缓存在会话中,但与cookie相比,会话具有完全独立的生命周期,因此需要进行null检查,并检查
ClaimsIdentity。当会话不为null时,还需要进行IsAuthenticated

对于索赔数据的存储位置有相同的问题。关于你的关切:

我担心的是,这些信息可能存储在身份验证cookie中,并发送到客户端,在那里可能会被操纵或更改


cookie经过加密和签名,因此在客户端既不能查看也不能篡改数据。

谢谢,您没有明确表示,
用户权限
存储在cookie中,但如果存储在cookie中,则是安全的。。。嗯,我想仍然有足够的理由将它们存储在服务器端的某个地方。例如,当权限更改时,可以更新缓存,而无需用户注销和再次登录。但你的观点确实减轻了对客户操纵的担忧。