2016-11-16 34 views
5

Tôi có thể sử dụng MemoryCache trong một ITicketStore để lưu trữ AuthenticationTicket không?Xác thực cookie Asp.Net Core

Bối cảnh: ứng dụng web của tôi đang sử dụng Cookie Xác thực:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    LoginPath = new PathString("/Authentication/SignIn"), 
    LogoutPath = new PathString("/Authentication/SignOut"), 
    ReturnUrlParameter = "/Authentication/SignIn" 
}); 

api web của tôi xử lý các quá trình cấp phép sử dụng thẻ truy cập (OAuth2).

Đôi (trên một số trình duyệt) ngoại lệ sau đây được ném:

Một ngoại lệ unhandled đã xảy ra: Cookie chunked là không đầy đủ. Chỉ có 1 trong 2 khối dự kiến ​​được tìm thấy, tổng cộng 4021 ký tự. Giới hạn kích thước ứng dụng khách có thể đã bị vượt quá.

Cookie rõ ràng là quá lớn. Điều này là lạ, bởi vì tôi không sử dụng nhiều tuyên bố. Tất cả trong số đó là các xác nhận quyền sở hữu mặc định (tên định danh, nonce, exp, v.v.). Tôi hiện đang cố gắng triển khai ITicketStore của riêng mình dưới dạng SessionStore trên số CookieAuthenticationOptions. AuthenticationTicket sẽ được lưu trữ trong một số MemoryCache (như trong số sample) này. Tôi rất mới cho toàn bộ chủ đề này và không chắc chắn, nếu đây là một cách tiếp cận tốt và nếu MemoryCache là một giải pháp hợp lệ.

+0

https://github.com/aspnet/Security/issues/830 vấn đề github Điều này có thể hữu ích cho bạn. –

Trả lời

6

Tôi có thể sử dụng MemoryCache trong một ITicketStore để lưu trữ AuthenticationTicket?

Tuyệt đối, đây là triển khai mà tôi đã sử dụng được gần một năm.

app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationScheme = "App.Cookie", 
    AutomaticAuthenticate = true, 
    AutomaticChallenge = true, 
    LoginPath = new PathString("/Authentication/SignIn"), 
    LogoutPath = new PathString("/Authentication/SignOut"), 
    ReturnUrlParameter = "/Authentication/SignIn", 
    SessionStore = new MemoryCacheStore(cache) 
}); 

Việc thực hiện MemoryCacheStore trông như thế này, và nó đi theo the example mà bạn chia sẻ:

public class MemoryCacheStore : ITicketStore 
{ 
    private const string KeyPrefix = "AuthSessionStore-; 
    private readonly IMemoryCache _cache; 

    public MemoryCacheStore(IMemoryCache cache) 
    { 
     _cache = cache; 
    } 

    public async Task<string> StoreAsync(AuthenticationTicket ticket) 
    { 
     var key = KeyPrefix + Guid.NewGuid(); 
     await RenewAsync(key, ticket); 
     return key; 
    } 

    public Task RenewAsync(string key, AuthenticationTicket ticket) 
    { 
     // https://github.com/aspnet/Caching/issues/221 
     // Set to "NeverRemove" to prevent undesired evictions from gen2 GC 
     var options = new MemoryCacheEntryOptions 
     { 
      Priority = CacheItemPriority.NeverRemove 
     }; 
     var expiresUtc = ticket.Properties.ExpiresUtc; 

     if (expiresUtc.HasValue) 
     { 
      options.SetAbsoluteExpiration(expiresUtc.Value); 
     }  

     options.SetSlidingExpiration(TimeSpan.FromMinutes(60)); 

     _cache.Set(key, ticket, options); 

     return Task.FromResult(0); 
    } 

    public Task<AuthenticationTicket> RetrieveAsync(string key) 
    { 
     AuthenticationTicket ticket; 
     _cache.TryGetValue(key, out ticket); 
     return Task.FromResult(ticket); 
    } 

    public Task RemoveAsync(string key) 
    { 
     _cache.Remove(key); 
     return Task.FromResult(0); 
    } 
} 
+0

Cảm ơn bạn đã trả lời. Có cách tiếp cận này bất kỳ bất lợi so với việc sử dụng cookie? Ứng dụng web có thể hết bộ nhớ là điều duy nhất tôi có thể nghĩ đến. – jasdefer

+0

Nó thực sự đang sử dụng cookie, do đó 'UseCookieAuthentication'. Nếu bộ nhớ là một mối quan tâm xem xét thực tế rằng những expire và sẽ fallout bộ nhớ khi hết hạn, vì chúng sẽ được phát hành và làm sạch. Ngoài ra, chúng rất nhỏ ... tương tự như vậy, tùy thuộc vào cách bạn thiết lập để lưu trữ ứng dụng có thể xác định xem liệu nó có bao giờ có tác động hay không. Bạn muốn có thể mở rộng quy mô. –

+0

Không có bộ nhớ nào không thực sự là một mối quan tâm. Tôi chỉ nghĩ về những nhược điểm chung. Vâng, nó sử dụng cookie, nhưng bản thân 'AuthenticationTicket' không được lưu trữ trong một cookie, chỉ có tham chiếu là. Điều này có đúng không? – jasdefer

Các vấn đề liên quan