我有一個.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;
}
嗨Henrik,我更新了問題,以顯示我們最終去的解決方案,但感謝您的信息。 – Fletch
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-incompatible-with-the-array?forum = azuremobile –
順便說一句,失敗實際上是在Autofacs ContinerBuilder.RegisterCallback(Action)方法中。關於這個ArrayTypeMismatchException的每篇文章都表明,程序集綁定重定向被搞砸了。但我已經使用NuGet Add-BindingRedirect命令更新了綁定重定向。 Azure主機環境與本地機器不同嗎? –