我正在使用 OnlineIdAuthenticator 类获取身份验证令牌以登录 Azure 应用服务,但我无法获取 NameIdentifier 声明服务器端。我需要 ID 来唯一标识用户并将其存储在数据库中。
我想使用 OnlineIdAuthenticator 启用单点登录,这样用户每次启动我的应用程序(Windows 应用商店应用程序)时都不会提示登录。
我在我的应用程序中使用此方法来获取令牌并登录:
protected override async Task<bool> LoginAsync()
{
var authenticator = new OnlineIdAuthenticator();
var mobileServicesTicket = new OnlineIdServiceTicketRequest("myapp.azurewebsites.net", "JWT");
var ticketRequests = new List<OnlineIdServiceTicketRequest>() { mobileServicesTicket };
var authResult = await authenticator.AuthenticateUserAsync(ticketRequests, CredentialPromptType.PromptIfNeeded);
if ((authResult.Tickets.Count == 1) && (authResult.Tickets[0].ErrorCode == 0))
{
var accessToken = authResult.Tickets[0];
var token = new JObject();
token.Add("authenticationToken", accessToken.Value);
var _mobileServiceClient = ServiceLocator.Current.GetInstance<IMobileServiceClient>();
var user = await _mobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount, token);
return true;
}
else
{
return false;
}
}
服务器端我使用这个方法来获取唯一的Id:
public static async Task<string> GetUserId(IPrincipal pricipal, HttpRequestMessage request)
{
ProviderCredentials credentials = await pricipal.GetAppServiceIdentityAsync<MicrosoftAccountCredentials>(request);
return credentials.Provider + ":" + credentials.Claims[ClaimTypes.NameIdentifier];
}
上面的 Claims 集合包含这些键:
ver、iss、exp、uid、aud、urn:microsoft:appuri、urn:microsoft:appid
其他一切似乎都有效。我可以使用我的 MicrosoftAccount 登录,并且可以调用需要身份验证的方法,但我无法生成用户 ID。
如何获取 Claims 集合中的 NameIdentifier?
试试这个:
var oid = claims.Where(x => x.Type == ClaimTypes.NameIdentifier).FirstOrDefault();