解密ASP.NET Core中的“.AspNetCore.Session”cookie

时间:2016-11-18 19:08:32

标签: c# asp.net asp.net-core asp.net-core-mvc asp.net-core-1.0

在Asp.Net核心中,当您将应用配置为app.UseSession()时,会创建一个Cookie。 默认情况下,cookie称为“.AspNetCore.Session”。其值标识要使用的会话。目前,我正在将我的会话数据保存在sql server上。我需要知道“.AspNetCore.Session”的解密值,以便我可以在数据库中查找会话。

有没有办法解密这个值?我知道ASP.NET必须以某种方式在幕后进行。

2 个答案:

答案 0 :(得分:2)

session source包含所有内容,但您需要了解它,ISessionStoreIDistributedSessionStore会为您提供一个会话密钥。

不是对cookie格式做出假设,是什么阻止你使用商店API?

答案 1 :(得分:-1)

我必须从Pad中提取隐私Microsoft.AspNetCore.Session函数,但我能够得到我需要的内容:

public class DiscussionController : Controller
{   
    private readonly IDataProtector _dataProtector;        

    public DiscussionController(IDataProtectionProvider dataProtectionProvider)
    {
        var protectorPurpose = "whatever purpose you want";

        _dataProtector = dataProtectionProvider.CreateProtector(protectorPurpose);
    }

    public IActionResult Index()
    {     
       HttpContext.Request.Cookies.TryGetValue(".AspNetCore.Session", out string cookieValue);

       var protectedData = Convert.FromBase64String(Pad(cookieValue));

       var unprotectedData = _dataProtector.Unprotect(protectedData);

       var humanReadableData = System.Text.Encoding.UTF8.GetString(unprotectedData);

        return Ok();
    }

    private string Pad(string text)
    {
        var padding = 3 - ((text.Length + 3) % 4);
        if (padding == 0)
        {
            return text;
        }
        return text + new string('=', padding);
    }    
}

Pad功能来自:https://github.com/aspnet/AspNetCore/blob/87629bbad906e9507026692904b6bcb5021cdd33/src/Middleware/Session/src/CookieProtection.cs#L61-L69