2014-02-19 34 views
0

我有一個MVC 5 asp.net網站,我需要將大量REST API公開給獨立的移動客戶端。網站的其餘部分使用基於表單的安全性,將ASP.NET_SessionId設置爲cookie,並在登錄後用於使用請求對用戶進行身份驗證。使用我的移動應用程序,我無法使用cookie方法,因爲cross-doman問題。我想要做的是用ASP.NET_SessionId的值添加一個標頭「X-SessionId」,然後在服務器端,有一個過濾器查找該字段,如果存在,則將該請求與給定會話。 (客戶端將使用AJAX POST調用登錄,這將在成功登錄後返回ASP.NET_SessionId)。手動將會話與當前請求關聯asp.net MVC

這可能嗎?

回答

0

是這樣的嗎?

public sealed class CustomSecurityAttribute : ActionFilterAttribute 
{ 

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext == null) 
     throw new ArgumentNullException("filterContext"); 
    if (string.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["X-SessionId"]) &&  IsAuthenticated(ilterContext.HttpContext.Request.Headers["X-SessionId"])) 
     filterContext.Result = new HttpNotFoundResult(); 
} 

private bool IsAuthenticated(string sessionId) 
{ 
    // get your user details from your database (or whatever) 
    var user = new UserRepository().Get(sessionId); 

    if (user == null) 
     return false; 

    // build up an identity, use your own or out of the box. 
    FormsIdentity itentity = new MyIdentity(user); 

    // Set the user 
    filterContext.HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(itentity , user.Roles); 

    return true; 
} 

} 

你將不得不當前會話存儲在數據庫中,因此,例如,當在搶用戶登錄的會話ID,並把它貼在數據庫中,這樣你就知道他們1..1當前會話。

然後,您可以查看它作爲您的身份驗證的一部分。

編輯:

讓我們退後一步,從不考慮一下cookie和session。

你有一個網站和一個寧靜的API,他們都服務於不同的目的和客戶,並有不同的安全要求。

那麼保護你的Api最常用的選項是什麼?

  • 基本認證。

    大多數安靜的API需要用戶名/密碼作爲標題的一部分或者在請求本身中發送。

  • 的認證令牌

    可以提供與用戶帳戶(GUID可能就足夠了),當請求是由您檢查令牌相關聯的令牌。

  • 使用現有protocal像OAuth

我會建議使用這些常見的場景,以確保您不會錯過的東西,打開你的自我可達安全漏洞。

有沒有理由不能使用這些?

+0

這是一個罰款開始的過濾器,但是我如何告訴asp.net使用X-SessionId查找(現有)會話並關聯HttpContext.Current.User和所有其他變量? –

+0

我已經爲潛在解決方案更新了我的答案,說實話,你有點前往野外,可能有更好的方法,像解決方案上的單一標誌可能是betteR? – shenku

+0

解決安全問題(將會話存儲在數據庫中)。我認爲ASP.NET將所有會話存儲在內部數據存儲中(可能只是一張地圖)。是否可以引用它,這樣我可以像普通客戶那樣將其他內容放入Session中? –

相關問題