如何设置Azure MobileServiceUser UserId

时间:2015-12-06 23:57:08

标签: azure-mobile-services

我正在寻找有关Azure移动服务身份验证的一些帮助,使用其中一个内置提供程序(谷歌,脸书等)。特别是,一种将MobileServiceUser的UserId设置为我在我的后端sql数据库中为该用户提供的Id的方法。

背景

我正在开发一个应用程序,该应用程序包含一个与azure移动服务.net后端连接的移动应用程序和一个使用与移动服务相同的数据库的azure MVC Web应用程序。

创建新用户和登录的一般工作流程是:

  • 新的最终用户由“admin”使用最终用户无权访问的MVC Web应用程序创建。
  • 在sql数据库中为这个新的最终用户创建了一个Id。
  • 使用此新创建的用户ID在其他相关表中创建该最终用户的附加数据。
  • 然后,最终用户需要使用移动设备登录移动服务才能查看和更新​​其数据。

我遇到的问题是MobileServiceUser中的UserId是登录提供程序创建的UserId。当我在移动服务中查询数据时,我使用TableController的ServiceUser中的UserId来确保最终用户只与他们的数据进行交互。

当“admin”创建它时,我想将MobileServiceUser的UserId设置为sql数据库中为最终用户创建的Id。

UserId是只读的,所以我假设我必须在服务器端执行此操作。

首先,我创建了一个CustomGoogleLoginProvider类,该类继承自GoogleLoginProvider并覆盖了CreateCredentials方法。在该方法中,我尝试从ClaimsIdentity中提取用户名,使用该用户名从数据库中获取Id,然后将生成的ProviderCredentials的UserID设置为该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实际上返回通过提供程序登录时使用的用户名,是否有人可以告诉我?谷歌,Facebook,Twitter和微软提供商的情况是一样的吗?
  4. 谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

我个人会推荐以下内容。使用您自己的数据结构为用户(我相信您已经在做),并为该表添加登录提供程序的字段。

示例:

用户

  • 编号
  • 一些信息
  • Microsoft帐户ID
  • Facebook帐户ID

如果用户使用您支持的任何帐户提供商登录您的服务,您只需在用户表中查询已与提供商ID相关联的用户。

这是我的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。