2015-01-31 19 views
7

Là một thử nghiệm, tôi đã tạo ra một ứng dụng Asp.Net MVC5 tươi bằng cách sử dụng mẫu mới nhất trong Visual Studio 2013. Tôi được thêm vào phương pháp sau đây để Global.asax.cs:Làm cách nào để Owin có thể đặt cookie xác thực Asp.Net sau giai đoạn Application_EndRequest?

protected void Application_PreSendRequestHeaders() 
    { 
     Response.AppendCookie(new HttpCookie("TotalNumberOfCookiesInApplication_EndRequestIs", Response.Cookies.Count + string.Empty)); 
    } 

Khi tôi bắt đầu ứng dụng và làm một POST để/tài khoản/Đăng nhập bằng cách sử dụng thông tin của người dùng đã đăng ký, các tập tin cookie mà có được trả lại cho khách hàng bao gồm:

enter image description here

Lưu ý rằng cookie tùy chỉnh tôi đã thêm các chương trình mà không có cookies trong phản hồi bởi thời gian Application_PreSendRequestHeaders() được gọi. Mặc dù vậy, tất cả các cookie Auth đến khách hàng. Tôi đã hiểu rằng Application_PreSendRequestHeaders() là giai đoạn cuối cùng chúng ta có thể "móc" vào để sửa đổi cookie. Phần mềm trung gian Owin có thể bằng cách nào đó thêm cookie sau đó không, hoặc tôi đang thiếu thứ gì đó?

(Trong trường hợp bạn quan tâm, động lực của tôi cho tất cả điều này là: Tôi đang cố sửa đổi miền của cookie xác thực thành ".abc.com", trong đó "abc.com" là cuối cùng hai phần của máy chủ trong URI yêu cầu. Tôi muốn thực hiện việc này để hỗ trợ xác thực trên nhiều tên miền phụ. môi trường dàn dựng/sản xuất và chúng tôi thường triển khai mã sản xuất để dàn dựng Azure trước tiên để thử nghiệm trước khi thực hiện trao đổi VIP).

(Cũng lưu ý rằng tôi biết bài viết như this one, tuy nhiên nó không giải thích nơi cookie đang thực sự thiết lập)

EDIT:

Dựa trên một tìm kiếm hơn chút, có vẻ như tôi đang nhìn vào đường ống sai. Owin có đường dẫn riêng của nó, vì vậy tôi tìm thấy this post mô tả cách chúng ta có thể móc vào nó. Viola ... có bánh quy. Sẽ là tuyệt vời nếu bất cứ ai có thể xác nhận rằng đây thực sự là cách hợp lý nhất để làm điều đó.

EDIT 2:

Cuối cùng quyết định nhìn vào mã nguồn Katana và phát hiện ra rằng tất cả những gì cần thiết để làm để có được lĩnh cookie của tôi thiết lập là đoạn mã sau vào CookieAuthenticationProvider tôi

   OnResponseSignIn = context => 
       { 
        // Example only! 
        context.CookieOptions.Domain = context.Request.Uri.Host; 
       }, 
       OnResponseSignOut = context => 
       { 
        // Example only! 
        context.CookieOptions.Domain = context.Request.Uri.Host; 
       } 

Sửa 3:

Một giải pháp thậm chí còn sạch hơn cho trường hợp của tôi chỉ là sử dụng trình quản lý cookie tùy chỉnh, đặt tên miền cookie dựa trên URI yêu cầu hiện tại:

/// <summary> 
/// This class simply appends the cookie domain to the usual auth cookies 
/// </summary> 
public class ChunkingCookieManagerWithSubdomains : ICookieManager 
{ 
    private readonly ChunkingCookieManager _chunkingCookieManager; 

    public ChunkingCookieManagerWithSubdomains() 
    { 
     _chunkingCookieManager = new ChunkingCookieManager(); 
    } 

    public string GetRequestCookie(IOwinContext context, string key) 
    { 
     return _chunkingCookieManager.GetRequestCookie(context, key); 
    } 

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.AppendResponseCookie(context, key, value, options); 
    } 

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.DeleteCookie(context, key, options); 
    } 
} 

... sau đó được thiết lập trong Auth Tùy chọn Cookie trong thiết lập Owin:

 app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      ... 
      CookieManager = new ChunkingCookieManagerWithSubdomains(), 
      ... 
      } 
     }); 

Hy vọng rằng sẽ giúp ai đó đi ngang qua cùng một loại câu hỏi.

+0

Trên thực tế, có thêm một giai đoạn mà bạn có thể treo trước khi tiêu đề được gửi đi. HttpApplication.PreSendRequestHeaders. –

+0

Cảm ơn Erik ... nó sẽ không giúp ích cho nhiệm vụ sửa đổi cookie Owin auth trong trường hợp này, nhưng bạn đã đúng trong câu lệnh của tôi là không chính xác. Tôi sẽ cập nhật cho bất kỳ ai khác. – sammy34

+0

Có vẻ như những chỉnh sửa đó sẽ hoạt động tốt như tự trả lời; nếu bạn di chuyển chúng đến một câu trả lời, tôi sẽ upvote. –

Trả lời

4

Theo yêu cầu của Tieson, dưới đây là tóm tắt các chỉnh sửa của tôi trong bài đăng gốc ở trên, làm câu trả lời.

Giải pháp được đề xuất: Sử dụng trình quản lý cookie tùy chỉnh.

/// <summary> 
/// This class simply appends the cookie domain to the usual auth cookies 
/// </summary> 
public class ChunkingCookieManagerWithSubdomains : ICookieManager 
{ 
    private readonly ChunkingCookieManager _chunkingCookieManager; 

    public ChunkingCookieManagerWithSubdomains() 
    { 
     _chunkingCookieManager = new ChunkingCookieManager(); 
    } 

    public string GetRequestCookie(IOwinContext context, string key) 
    { 
     return _chunkingCookieManager.GetRequestCookie(context, key); 
    } 

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.AppendResponseCookie(context, key, value, options); 
    } 

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options) 
    { 
     // Simplification (use the context parameter to get the required request info) 
     options.Domain = ".domainBasedOnRequestInContext.com"; 
     _chunkingCookieManager.DeleteCookie(context, key, options); 
    } 
} 

... mà sau đó có thể được thiết lập trong Auth Tùy chọn Cookie trong thiết lập Owin:

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      ... 
      CookieManager = new ChunkingCookieManagerWithSubdomains(), 
      ... 
      } 
     }); 
Các vấn đề liên quan