【问题标题】:How Do I Manually Get At The Information In the .aspnet.cookies Cookie?如何手动获取 .aspnet.cookies Cookie 中的信息?
【发布时间】:2014-03-29 08:51:45
【问题描述】:

我们有一个身份验证设置,除了在标头中发送的不记名令牌之外,我们不允许所有内容。

但是,我有一种情况,我需要为一个 Web API 控制器使用 cookie。

我可以看到在名为“.aspnet.cookies”的请求中已经发送了一个 cookie,其中填充了加密值。

如果我能找到一种方法来解密该值,它将解决我的问题,但我不清楚如何去做。

遗憾的是,出于技术原因,我不能仅仅将身份验证配置为自动使用 cookie。

有谁知道我可以使用什么类来调用手动解密 cookie 值?

【问题讨论】:

    标签: asp.net .net asp.net-web-api oauth-2.0 asp.net-identity


    【解决方案1】:

    我(OP)今天一直在研究这个问题,但我没有找到我正在寻找的确切答案,但确实找到了解决方法。

    我非常确信 OWIN 中间件在内部以某种方式使用 ISecureDataFormat 来保护/取消保护我看到的 cookie(名为“.aspnet.cookies”)。我无法弄清楚框架使用了哪个 ISecureDataFormat,但我确实找出了我们在哪里使用一个来处理 AJAX 请求标头中传递的不记名令牌。

    基本上,在 AuthStartup 类中,我有一些 OAuthAuthorizationServerOptions 并发现我们使用它的 AccessTokenFormat 属性(它是一个 ISecureDataFormat)来处理不记名令牌。

    由于我可以从我的班级访问 AuthStartup.OAuthOptions.AccessTokenFormat,我决定将不记名令牌的值放入我自己的会话 cookie,然后使用 AuthStartup.OAuthOptions.AccessTokenFormat.Uprotect() 来解密它的值。

    这给了我一个 AuthenticationTicket,我可以将其身份填充到 GenericPrincipal 中,然后我将其分配给自定义 FilterAttribute/IAuthorizationFilter 中的 System.Threading.Thread.CurrentPrincipal 和 HttpContext.Current.User,我将其应用于需要的控制器使用 cookie。

    我希望我知道如何更优雅地处理这种情况,但它确实达到了我想要完成的目的。

    【讨论】:

    • 所以,您找到了写入该值的代码,就像我说的那样!那时你想出了一个很好的解决方案。 UP-Vote :)
    • 其实,没有。将值写入“.aspnet.cookies”cookie 的代码仍然是一个问号。我只是通过捎带我们用来创建不记名令牌的代码来制作我自己的自定义解决方案。不过,感谢您尝试提供帮助!我很感激!
    • 所以你实际上并没有弄清楚如何解密 cookie,只是决定做一些完全不同的事情?
    【解决方案2】:

    我不确定您指的是读取 cookie 还是解密 cookie 中的自定义数据。如果它是 FormsAuthentication cookie,就像您的情况一样,那么您将需要提取经过身份验证的请求的 FormsIdentity 票证,其形式为 FormsAuthenticationTicket

    如果您要求解密 FormsAuthenticationTicket.UserData 中的自定义数据,那么您将需要使用与加密相同的密码。

    【讨论】:

    • 我想解密 cookie 的值,但我实际上并没有使用 Forms Auth(这很糟糕,因为如果是这种情况,我可以只使用 FormsAuthentication.Decrypt())。有关详细信息,请参阅我关于 Jasmine 答案的 cmets。
    【解决方案3】:

    它不是一个加密值,它是一个令牌/票证/sessionID。这一切都有很好的记录......

    这告诉了如何读取和放置 cookie - 这很容易...http://msdn.microsoft.com/en-us/library/ms178194.ASPX

    这说明了所有关于 ASP.Net 身份验证 cookie... http://support.microsoft.com/kb/910443

    【讨论】:

    • 我没有使用 Forms Auth,我使用的是 OWIN,我的整个问题不是关于如何使用 cookie,而是如何在 auth cookie 的值中解密票证。顺便说一句,它是 491 个字符,所以它只是一个 ID 非常值得怀疑。
    • 顺便说一句,我实际上尝试使用 FormsAuthentication.Decrypt() 来查看它是否使用了相同的机制,但事实并非如此。我猜我需要使用 ISecureDataFormat.Unprotect() 方法的一些实现,但我不确定如何确定我想要使用的确切类以及如何初始化它。
    • 如果是你自己的代码放入的cookie,你怎么可能不知道如何解密呢?去找放那个 cookie 的代码,那应该很明显了吧?您没有为我们提供足够的信息来回答这个问题,但我怀疑您的代码库中的某个地方有这些信息。不可能,真的。
    • @Jasmine,你不明白这个问题。 asp.net/identity是使用的技术,OWIN中间件是设置cookie的,不是开发者专门设置的。我期待这个问题也能得到解答。
    • 完全正确。在某个地方,中间件似乎正在使用 ISecureDataFormat 来保护/取消保护 cookie 内容。我没有弄清楚确切的机制或如何获得正确的 ISecureDataFormat,但我确实实施了一个解决方法,我将在答案中写出来。
    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2012-02-14
    • 1970-01-01
    • 2018-06-11
    • 2020-01-30
    相关资源
    最近更新 更多