我正在寻找有关Azure移动服务身份验证的一些帮助,使用其中一个内置提供程序(谷歌,脸书等)。特别是,一种将MobileServiceUser的UserId设置为我在我的后端sql数据库中为该用户提供的Id的方法。
背景
我正在开发一个应用程序,该应用程序包含一个与azure移动服务.net后端连接的移动应用程序和一个使用与移动服务相同的数据库的azure MVC Web应用程序。
创建新用户和登录的一般工作流程是:
我遇到的问题是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;
}
我有几个问题:
谢谢你的时间!
答案 0 :(得分:0)
我个人会推荐以下内容。使用您自己的数据结构为用户(我相信您已经在做),并为该表添加登录提供程序的字段。
示例:
用户强>
如果用户使用您支持的任何帐户提供商登录您的服务,您只需在用户表中查询已与提供商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;
}
编辑:完全忘记了问题: