我已经在我的移动服务中实现了自定义身份验证,但是我添加到ClaimsIdentity对象中的声明似乎没有被保存。
创建ClaimsIdentity对象,然后将其传递给CreateLoginResult方法,如下所示:
public IServiceTokenHandler Handler { get; set; }
...
ClaimsIdentity claimsIdentity = new ClaimsIdentity();
claimsIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, "username"));
claimsIdentity.AddClaim(new Claim(ClaimTypes.GivenName, "FirstName"));
claimsIdentity.AddClaim(new Claim(ClaimTypes.Surname, "LastName"));
LoginResult login = new CustomLoginProvider(Handler).CreateLoginResult(claimsIdentity, "masterkey");
如果使用返回的授权令牌调用另一个方法并尝试检索GivenName或姓氏声明,则它们不可用。
var identity = (ClaimsIdentity)User.Identity;
// 'claim' will be null
Claim claim = identity.FindFirst(ClaimTypes.GivenName);
这是预期的行为还是我做错了什么?我假设发送给CreateLoginResult的ClaimsIdentity对象中的Claims是针对经过身份验证的用户保存的。
传入此方法的ClaimsIdentity不会被充分使用,除非您在CreateCredentials()
的过载中对其进行操作。首先,您应该创建一个包含所需字段的ProviderCredentials子类。CreateCredentials()将被CreateLoginResult()
调用,它将获得与参数相同的ClaimsIdentity。
返回的ProviderCredentials被存储,并且您总是可以通过调用ServiceUser.GetIdentitiesAsync()
在服务器代码中再次检索它。