gpt4 book ai didi

azure-mobile-services - 在 Windows Azure 移动服务中实现自定义身份验证

转载 作者:行者123 更新时间:2023-12-04 13:08:17 28 4
gpt4 key购买 nike

Windows Azure 移动服务目前没有自定义身份验证和查看功能请求的选项

http://feedback.azure.com/forums/216254-mobile-services/suggestions/3313778-custom-user-auth

它不会很快到来。

使用 .NET 后端和 .NET 应用程序,您如何实现自定义身份验证,以便您不必使用 Facebook、Google 或他们当前的任何其他提供商?

有很多部分完成的教程是关于如何使用 JS 后端、iOS 和 Android 完成此操作的,但是 .NET 示例在哪里?

最佳答案

在下面列出的文章、一些智能感知和一些反复试验的帮助下,我终于完成了解决方案。

WAMS 的工作原理

首先,我想以非常简单的形式描述 WAMS 是什么,因为这部分让我困惑了一段时间,直到它最终被点击。 WAMS 只是为快速部署而打包的现有技术的集合。对于这种情况,您需要了解的是:

enter image description here

正如你所看到的,WAMS 实际上只是一个 WebAPI 和其他东西的容器,我不会在这里详细介绍。在 Azure 中创建新的移动服务时,您可以下载包含 WebAPI 的项目。他们使用的示例是 TodoItem,因此您将通过项目看到此场景的代码。

下面是你从哪里下载这个例子(我只是在做一个 Windows Phone 8 应用程序)

enter image description here

我可以继续讨论这个问题,但本教程将帮助您入门:

http://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-windows-store-dotnet-get-started/



设置 WAMS 项目

您将需要您的 MasterKey 和 ApplicationKey。您可以从 Azure 门户获取它们,单击您的移动服务应用程序并按底部的管理 key

enter image description here

您刚刚下载的项目,在 Controllers 文件夹中,我刚刚创建了一个名为 AccountController.cs 的新 Controller ,并在里面放了
    public HttpResponseMessage GetLogin(String username, String password)
{
String masterKey = "[enter your master key here]";
bool isValidated = true;

if (isValidated)
return new HttpResponseMessage() { StatusCode = HttpStatusCode.OK, Content = new StringContent("{ 'UserId' : 'F907F58C-09FE-4F25-A26B-3248CD30F835', 'token' : '" + GetSecurityToken(new TimeSpan(1,0, 0), String.Empty, "F907F58C-09FE-4F25-A26B-3248CD30F835", masterKey) + "' }") };
else
return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Username and password are incorrect");

}

private 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;
}

您可以使用自己的验证代码替换 GetLogin 中的内容。验证后,它将返回所需的安全 token (JWT)。

如果您在本地主机上进行测试,请记住进入您的 web.config 文件并填写以下键
<add key="MS_MasterKey" value="Overridden by portal settings" />
<add key="MS_ApplicationKey" value="Overridden by portal settings" />

您需要在此处输入您的主 key 和应用程序 key 。当您上传它们时,它们将被覆盖,但如果您在本地运行所有内容,则需要输入它们。

在 TodoItemController 的顶部添加 AuthorizeLevel 属性,如下所示
[AuthorizeLevel(AuthorizationLevel.User)]
public class TodoItemController : TableController<TodoItem>

您将需要修改 TodoItemController 中的大部分功能,但这里是 Get All 功能的示例。
    public IQueryable<TodoItem> GetAllTodoItems()
{
var currentUser = User as ServiceUser;

Guid id = new Guid(currentUser.Id);

return Query().Where(todo => todo.UserId == id);
}

只是附带说明,我使用 UserId 作为 Guid(唯一标识符),您需要将其添加到 todo 模型定义中。您可以将 UserId 设为您想要的任何类型,例如整数32

Windows Phone/商店应用

请注意,这只是一个例子,一旦你的主应用程序运行起来,你应该清理它。

在您的客户端应用程序上

安装 NuGet 包:Windows Azure 移动服务

进入 App.xaml.cs 并将其添加到顶部
    public static MobileServiceClient MobileService = new MobileServiceClient(
"http://localhost:50527/",
"[enter application key here]"
);

在我创建的 MainPage.xaml.cs 中
public class Token
{
public Guid UserId { get; set; }
public String token { get; set; }
}

在主类中添加一个 Authenticate 函数
    private bool Authenticate(String username, String password)
{
HttpClient client = new HttpClient();
// Enter your own localhost settings here
client.BaseAddress = new Uri("http://localhost:50527/");

client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = client.GetAsync(String.Format("api/Account/Login?username={0}&password={1}", username, password)).Result;

if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
var token = Newtonsoft.Json.JsonConvert.DeserializeObject<Token>(response.Content.ReadAsStringAsync().Result);

App.MobileService.CurrentUser = new MobileServiceUser(token.UserId.ToString());
App.MobileService.CurrentUser.MobileServiceAuthenticationToken = token.token;

return true;
}
else
{
//Something has gone wrong, handle it here
return false;
}

}

然后在 Main_Loaded 函数中
    private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
Authenticate("test", "test");

RefreshTodoItems();
}

如果您在 WebAPI 中有断点,您将看到它进来,获取 token ,然后返回到 ToDoItemController 并且 currentUser 将填充 UserId 和 token 。

您将需要创建自己的登录页面,因为使用此方法您不能将自动创建的页面与其他身份提供者一起使用。然而,我更喜欢创建自己的登录屏幕。

任何其他问题请在评论中告诉我,如果可以,我会提供帮助。

安全说明

记得使用 SSL。

引用文献

[] 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/

[] http://chrisrisner.com/Custom-Authentication-with-Azure-Mobile-Services-and-LensRocket

关于azure-mobile-services - 在 Windows Azure 移动服务中实现自定义身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25347421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com