2

我有一個.net移動服務後端擴展Azure的移動服務的功能(即不是JavaScript的一個)開箱支持與常見的身份提供商(Facebook,微博等),通過認證windows azure門戶。不過,我希望用戶能夠像創建自己的用戶名/密碼帳戶一樣使用ASP.NET身份的ASP.NET Web Api實現(使用AccountController)。使用ASP.NET身份

問題是如果這是可能的,如果是的話,那麼實現它的最好方法是什麼?

我的第一個想法是從模板ASP.NET MVC Web Api項目中複製適當的類(AccountController,Startup.Auth,ApplicationOAuthProvider等),並添加對Microsoft.AspNet.Identity.EntityFramework和System的引用。 Web.MVC但我不知道這會有什麼影響。如果它能工作,我只是通過門戶「身份」來控制身份驗證邏輯不再有任何作用?

另一種選擇是簡單地從一個Web Api項目開始,並添加移動服務功能,而不是(雖然我看不到如何創建一個沒有MVC的Web Api項目,但這是一個不同的問題)。

感謝您的任何幫助。

UPDATE 2014年4月11日

在我們決定來管理我們自己的用戶名和密碼,並生成一個JWT令牌,以便客​​戶端可以使用標準IMobileServiceClient結束。爲此,我們使用了兩個資源。第一次是從代碼的喜悅:

http://www.thejoyofcode.com/Exploring_custom_identity_in_Mobile_Services_Day_12_.aspx

,第二次是從內容主要:

http://www.contentmaster.com/azure/creating-a-jwt-token-to-access-windows-azure-mobile-services/

雖然我們做了一些小的改動代碼按照該移動服務團隊博客文章:

[沒有足夠的信譽點添加第三個鏈接,所以只是谷歌「變化在天藍色的移動服務的jwt令牌」]

所以這裏是代碼如果有用。 (它可能會更好編寫使用JwtSecurityTokenHandler的實現,但這爲我們工作)

public static string GetSecurityToken(TimeSpan periodBeforeExpires, string aud, string userId, string masterKey) 
    { 
     var now = DateTime.UtcNow; 
     var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
     var payload = new 
         { 
          exp = (int)now.Add(periodBeforeExpires).Subtract(utc0).TotalSeconds, 
          iss = "urn:microsoft:windows-azure:zumo", 
          ver = 2, 
          aud = "urn:microsoft:windows-azure:zumo", 
          uid = userId 
         }; 

     var keyBytes = Encoding.UTF8.GetBytes(masterKey + "JWTSig"); 
     var segments = new List<string>(); 

     //kid changed to a string 
     var header = new { alg = "HS256", typ = "JWT", kid = "0" }; 
     byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(header, Formatting.None)); 
     byte[] payloadBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload, Formatting.None)); 
     segments.Add(Base64UrlEncode(headerBytes)); 
     segments.Add(Base64UrlEncode(payloadBytes)); 
     var stringToSign = string.Join(".", segments.ToArray()); 
     var bytesToSign = Encoding.UTF8.GetBytes(stringToSign); 
     SHA256Managed hash = new SHA256Managed(); 
     byte[] signingBytes = hash.ComputeHash(keyBytes); 
     var sha = new HMACSHA256(signingBytes); 
     byte[] signature = sha.ComputeHash(bytesToSign); 
     segments.Add(Base64UrlEncode(signature)); 
     return string.Join(".", segments.ToArray()); 
    } 

    // from JWT spec 
    private static string Base64UrlEncode(byte[] input) 
    { 
     var output = Convert.ToBase64String(input); 
     output = output.Split('=')[0]; // Remove any trailing '='s 
     output = output.Replace('+', '-'); // 62nd char of encoding 
     output = output.Replace('/', '_'); // 63rd char of encoding 
     return output; 
    } 

回答

1

這是可能的,但不是很簡單,因爲我們想(我們對提高一個bug)。一般來說,可以歸結爲您可以將注入的東西注入OWIN管道,包括授權提供者。

如果你熟悉OWIN管道和ASP.NET身份框架那麼這裏大概你做什麼:

1)木箱自己OWIN應用構建其樹立OWIN管道爲.NET後端。

2)與依賴注入引擎,將調用作爲初始化的一部分註冊您的應用程序生成器。

這裏是什麼樣子(採用最新NuGets從一個的NuGet要點。ORG):

https://gist.github.com/HenrikFrystykNielsen/9835526

它不會自動勾搭成「登錄」控制器,我們有一個工作項目,以實現這一點,但我認爲,如果你小心它應該工作。

順便說一句,你可以找到菲利普W公司的博客一些有用的信息:http://www.strathweb.com/2014/02/running-owin-pipeline-new-net-azure-mobile-services/

希望這有助於!

Henrik

+0

嗨Henrik,我更新了問題,以顯示我們最終去的解決方案,但感謝您的信息。 – Fletch

+0

Heinrik,我想按照您的建議註冊我自己的Owin AppBuilder,但是當我按照上面的「要點」鏈接在發佈時崩潰。這與此處所述的問題完全相同:http://social.msdn.microsoft.com/Forums/windowsazure/en-US/ce286613-cd6a-4052-84e6-f2c1f403571a/mobile-service-web-api-error-attempted -a-access-an-element-as-a-type-in​​compatible-with-the-array?forum = azuremobile –

+0

順便說一句,失敗實際上是在Autofacs ContinerBuilder.RegisterCallback(Action )方法中。關於這個ArrayTypeMismatchException的每篇文章都表明,程序集綁定重定向被搞砸了。但我已經使用NuGet Add-BindingRedirect命令更新了綁定重定向。 Azure主機環境與本地機器不同嗎? –