2013-02-06 18 views
1

我正試圖與ServiceStack一起構建一個新的移動產品。它正在慢慢地走到一起,但文件雖然很好,但是有些部分簡短,沒有評論&問題的便利。關於ServiceStack身份驗證的澄清/示例

這個問題是關於內置認證。

我一直在從SocialBootstrap工作,這是一個很好的例子,雖然我缺乏骨幹經驗是有點阻礙。我想同時學習它,但沒有時間去做,所以想繼續傳統的觀點。

基於此,有一些樣本或文檔擴展將非常有用。

1.爲什麼AuthUserSession字符串上的所有屬性? 我看到通過CustomUserSession類,你可以創建一個CustomId,但不應該默認屬性映射到數據庫表的AutoIncrement屬性?不得不解析爲一個整數並不是很理想。我想這只是一次,但仍然顯得很古怪。

var user = session.TranslateTo<User>(); 
user.Id = int.Parse(session.UserAuthId); 

2.檢索會話 我控制器從ControllerBase它實現ServiceStackController<CustomUserSession>得出的。要想從控制器會話很容易與base.UserSession。如果我需要訪問View中的會話,那麼我只需將會話填入ViewBag屬性中。

我的服務對象擴展AppServiceBase,此刻我已經能夠訪問會話的唯一方法是通過注射ClientCache

public ICacheClient CacheClient { get; set; } 

,然後調用:

var userSession = SessionFeature.GetOrCreateSession<AuthUserSession>(CacheClient); 

這並未看起來並不是最優雅的解決方案,所以我希望有一種我不知道的更好的方式。可通往..

3 IClientCache 從閱讀this question這聽起來像我需要實現一個更爲持久的會話緩存。每次重新編譯時都必須進行身份驗證,保存_layout或任何其他應用重置操作都很煩人。

更持久緩存的推薦解決方案是使用Memcached嗎?不幸的是,在過去,我只使用FormsAuthentication,所以這又是一個新領域。

container.Register<ICacheClient>(new MemcachedClientCache("127.0.0.0[:11211]"); 

4.手動註冊 這是一個奇怪的一個。我試圖在沒有互聯網連接的情況下編碼,所以我實施了手動註冊,以避免在我的控制器上註釋掉所有[Authenticate]屬性(視圖也有一些登錄邏輯)。

它的工作,或者我記得它工作,因爲我可以繼續調試。然而現在回到互聯世界卻不是。API端點似乎不存在。如果我瀏覽到/api/register,那麼我會收到NotImplementedException。同樣,因爲我沒有使用主幹我有一個JavaScript函數來執行的工作:

var gateway = new servicestack.ClientGateway(location.protocol + "//" + location.host + '/api/'); 

function intiRegisterUser() { 
    $('#signup-button').click(function() { 
     gateway.postFormDataToService({ 
       Register: { 
        userName: $('#Username').val(), 
        displayName: $('#Username').val(), 
        firstName: $('#FirstName').val(), 
        lastName: $('#LastName').val(), 
        email: $('#Email').val(), 
        password: $('#Password').val() 
       } 
      }, 
      function(e) { 
       document.location = "/"; 
      }, 
      function(ex) { 
       handleError(ex); 
      }); 
    }); 
} 

這也返回NotImplementedException

本文檔頁是偉大的順便說一句,但可以擴展一點,包括這一些。

https://github.com/ServiceStack/ServiceStack/wiki/Sessions

回答

3

1.爲什麼在AuthUserSession字符串的所有屬性?

ServiceStack's built-in Authentication旨在支持多個Auth存儲庫和會話提供程序後端。爲了能夠支持多個提供者並減少創建新提供者所需的摩擦力,許多元數據屬性保留爲可以容納任何數據類型的字符串(與只能容納32位整數的int相對)。

2.檢索會話

當使用ServiceStack's New API可以從方便Service基類,它可以讓你訪問類型化UserAuthSession繼承:

base.SessionAs<AuthUserSession>(); 

它還提供了對動態訪問會議包:

base.Session["dynamicProperty"] 

3. IClientCache

如果您想要永久緩存,請使用ServiceStack's distributed cache providers中的任意一個。我推薦Redis的這holds many advantages over Memcachedeasy to get running in Windows with Vagrant

4.手動註冊

/api/register服務only implements HTTP POST。雖然custom route for the Registration Service is /registerpre-defined route的RegistrationService(其中您的例子是使用)由Registration Request DTO這是推斷:

/api/json/syncreply/Registration 

as of v3.9.35 release,較短的別名:

/api/json/reply/Registration 

所以,你的JavaScript示例需要使用註冊財產,例如:

gateway.postFormDataToService({ 
    Registration: { .. } 
}); 
+0

謝謝澄清。我認爲UserId字符串屬性會出於這個原因。也許它在文檔中,我跳過了它。服務會話檢索要好得多,謝謝!將看看Redis,我打算繼續看看它來替換我的數據庫。至於註冊,我忘了提及我已經嘗試過'Registration:'並且它返回相同的NotImplementedException。我還瀏覽了/ api/json/syncreply /註冊 - 這也顯示了一個NotImplementedException。我在v3.9.33.0 – Jordan

+0

NuGet更新了一切。得到它的工作,謝謝! – Jordan