2015-12-06 29 views
1

我正在尋找使用內置提供程序(谷歌,臉譜等)之一的Azure移動服務認證的一些幫助。特別是一種將MobileServiceUser的UserId設置爲我在該用戶的後端sql數據庫中具有的Id的方法。如何設置Azure MobileServiceUser UserId

背景:

我對由移動應用與蔚藍的移動服務.NET後端和使用相同的數據庫作爲移動業務的蔚藍MVC的Web應用程序接口的應用程序的工作。

創建一個新用戶,並登錄在一般的工作流程是:

  • 新的最終使用者是由「管理員」使用,最終用戶不必訪問MVC Web應用程序創建的。
  • 在sql數據庫中爲這個新的最終用戶創建一個Id。
  • 該最終用戶的其他數據是使用這個新創建的用戶標識在其他相關表中創建的。
  • 然後要求最終用戶使用他們的移動設備登錄移動服務來查看和更新​​他們的數據。

我的問題是MobileServiceUser中的UserId是由登錄提供程序創建的UserId。當我在移動服務中查詢數據時,我使用TableController的ServiceUser中的UserId來確保最終用戶僅與其數據交互。

我想將MobileServiceUser的UserId設置爲在「admin」創建時在最終用戶的sql數據庫中創建的Id。

UserId是隻讀的,所以我假設我將不得不在服務器端做到這一點。

因此,我創建了一個CustomGoogleLoginProvider類,該類繼承自GoogleLoginProvider並覆蓋了CreateCredentials方法。在該方法中我嘗試提取從ClaimsIdentity的用戶名,使用用戶名從數據庫中獲取的標識,然後將產生的ProviderCredentials到該ID的用戶名:

public override ProviderCredentials CreateCredentials(ClaimsIdentity claimsIdentity) 
    { 
     var username = claimsIdentity.FindFirst(ClaimTypes.Name).Value; 

     var context = new MyAppContext(); 

     var user= context.Users.FirstOrDefault(p => p.Email == username); 

     var result = base.CreateCredentials(claimsIdentity); 

     result.UserId = user.Id; 

     return result; 
    } 

我有幾個問題:

  1. 以這種方式更改UserId是否安全?
  2. 如果不是,還有更好的方法嗎?
  3. 我不知道如何交互式運行移動服務認證代碼,所以我不能告訴它是否實際工作。任何人都可以讓我知道,如果claimsIdentity.FindFirst(ClaimTypes.Name).Value實際上返回通過提供者登錄時使用的用戶名? Google,Facebook,Twitter和微軟提供商的情況是否如此?

謝謝你的時間!

回答

0

我個人會推薦以下。爲用戶使用您自己的數據結構(您已經這麼做了,我相信),並將登錄提供程序的字段添加到該表中。

例子:

用戶

  • 編號
  • 一些信息
  • 微軟帳戶ID
  • 的Facebook帳戶ID

如果使用rs通過任何受支持的帳戶提供程序登錄到您的服務中,您可以只查詢與用戶相關聯的用戶的用戶表。

這裏是什麼我CreateCredentials看起來像一個縮小版本(雖然爲Microsoft帳戶,但真的沒有多大的差別)

public override ProviderCredentials CreateCredentials(ClaimsIdentityclaimsIdentity) 
{ 
    string microsoftAccoundId = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value; 
    var account = context.Authors.Where(a => a.MicrosoftAccountId == microsoftAccoundId).FirstOrDefault(); 

    // set our own account id 
    var microsoftCredentials = base.CreateCredentials(claimsIdentity); 
    microsoftCredentials.UserId = this.TokenHandler.CreateUserId(base.Name, account.Id); 

    return microsoftCredentials; 
} 

編輯:完全忘了問題:

  1. 我會說是的。
  2. 不確定。
  3. 我不確定你是否真的可以得到那樣的用戶名。但是,您可以改爲使用ClaimTypes.NameIdentifier獲取帳戶ID。
+0

謝謝費迪南德,這似乎是一個合乎邏輯的方法。你知道如何去設置數據庫中用戶的提供者ID,以便它可以在CreateCredentials方法中查找嗎?我想我需要能夠查找正確的用戶,以便設置它 – PlexiCode

+0

我真的在上面的方法中做到這一點。我將它排除在外,因爲它會大大增加答案的長度。基本上你可以在這個方法中訪問你的數據庫上下文。所以你可以查詢你的上下文,看看是否已經存在一個提供者ID的用戶(我在上面的第3行),如果不是隻爲該Id創建一個新用戶。這意味着,如果有人第一次使用未知提供者ID登錄,則會爲他創建一個用戶(來自您的表)。 –

相關問題