Asp.net core .NET Core对自定义ITicketStore实现返回的键值做了什么;是否已发送到浏览器?

Asp.net core .NET Core对自定义ITicketStore实现返回的键值做了什么;是否已发送到浏览器?,asp.net-core,session,session-cookies,Asp.net Core,Session,Session Cookies,我在.NET Core中实现了自己的ITicketStore实现,该实现负责将会话cookie存储在redis数据库中。我的密钥是一个简单的guid: public async Task<string> StoreAsync(AuthenticationTicket ticket) { var log = new StringWriter(); var guid = Guid.NewGuid(); var key = "

我在.NET Core中实现了自己的ITicketStore实现,该实现负责将会话cookie存储在redis数据库中。我的密钥是一个简单的guid:

    public async Task<string> StoreAsync(AuthenticationTicket ticket)
    {
        var log = new StringWriter();
        var guid = Guid.NewGuid();
        var key = "MyCustomCache"+ guid.ToString();
        await RenewAsync(key, ticket);
        return key;
    }
    public Task RenewAsync(string key, AuthenticationTicket ticket)
    {
        var options = new DistributedCacheEntryOptions();
        var expiresUtc = ticket.Properties.ExpiresUtc;
        if (expiresUtc.HasValue)
        {
            options.SetAbsoluteExpiration(expiresUtc.Value);
        }
        byte[] val = SerializeToBytes(ticket);
        _cache.Set(key, val, options);
        return Task.FromResult(0);
    }
public async Task StoreAsync(AuthenticationTicket票据)
{
var log=新的StringWriter();
var guid=guid.NewGuid();
var key=“MyCustomCache”+guid.ToString();
等待续订异步(密钥、票证);
返回键;
}
公共任务续订异步(字符串密钥、身份验证票证)
{
var options=新的DistributedCacheEntryOptions();
var expiresUtc=ticket.Properties.expiresUtc;
if(expiresUtc.HasValue)
{
options.SetAbsoluteExpiration(expiresUtc.Value);
}
字节[]val=序列化字节(票证);
_cache.Set(键、值、选项);
返回Task.FromResult(0);
}
但是,在浏览器中,当我检查cookie的值时,它似乎以某种方式进行了编码/加密(而不是我生成的guid):

当cookie传递给我的应用程序时,我注意到它已转换回我在StoreAsync中创建的原始值:

public Task<AuthenticationTicket> RetrieveAsync(string key)
{
    // Key passed in here will not be the value in the image above. Instead it will be what was 
    // generated in StoreAsync
    AuthenticationTicket ticket;
    byte[] bytes = null;
    bytes = _cache.Get(key);
    ticket = DeserializeFromBytes(bytes);
    return Task.FromResult(ticket);
}
公共任务检索同步(字符串键)
{
//此处传递的密钥将不是上面图像中的值,而是以前的值
//在StoreAsync中生成
认证票证;
字节[]字节=null;
字节=_cache.Get(键);
票证=反序列化FromBytes(字节);
返回任务.FromResult(票证);
}

.NETCore到底对我的密钥做了什么来加密/编码密钥?这会影响我平衡应用程序负载的能力吗?我知道在默认会话存储机制中.NET Core使用每台机器的动态密钥对会话cookie进行加密。

使用默认数据保护对身份验证cookie进行加密

这里是将密钥添加到cookie()的位置:

if(Options.SessionStore!=null)
{
if(_sessionKey!=null)
{
wait Options.SessionStore.RemoveAsync(_sessionKey);
}
_sessionKey=wait Options.SessionStore.StoreAsync(票证);
var principal=新索赔(
新索赔实体(
new[]{new Claim(SessionIdClaim,_sessionKey,ClaimValueTypes.String,Options.claimssuer)},
期权(索赔人);
票证=新的身份验证票证(主体,空,Scheme.Name);
}
var cookieValue=Options.TicketDataFormat.Protect(ticket,GetTlsTokenBinding());

切换到SessionStore时,会话密钥只是作为声明添加的,然后cookie将受到保护。

身份验证cookie将使用默认数据保护进行加密

这里是将密钥添加到cookie()的位置:

if(Options.SessionStore!=null)
{
if(_sessionKey!=null)
{
wait Options.SessionStore.RemoveAsync(_sessionKey);
}
_sessionKey=wait Options.SessionStore.StoreAsync(票证);
var principal=新索赔(
新索赔实体(
new[]{new Claim(SessionIdClaim,_sessionKey,ClaimValueTypes.String,Options.claimssuer)},
期权(索赔人);
票证=新的身份验证票证(主体,空,Scheme.Name);
}
var cookieValue=Options.TicketDataFormat.Protect(ticket,GetTlsTokenBinding());
当切换到SessionStore时,会话密钥只是作为声明添加,然后cookie受到保护