C# 使用OnlineIdAuthenticator在Azure应用程序服务中获取NameIdentifier声明

C# 使用OnlineIdAuthenticator在Azure应用程序服务中获取NameIdentifier声明,c#,win-universal-app,azure-web-app-service,claims,azure-mobile-services,C#,Win Universal App,Azure Web App Service,Claims,Azure Mobile Services,我正在使用OnlineIdAuthenticator类获取身份验证令牌,以便登录Azure应用程序服务,但我无法获取NameIdentifier声明服务器端。我需要唯一标识用户并将其存储在数据库中的Id 我想使用OnlineIdAuthenticator启用单点登录,这样用户不会在每次启动我的应用程序(Windows应用商店应用程序)时都被提示登录 我在应用程序中使用此方法获取令牌并登录: protected override async Task<bool> LoginAs

我正在使用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;
        }
    }
protectedoverride异步任务LoginAsync()
{
var authenticator=新的OnlineIdAuthenticator();
var mobileServicesTicket=新的OnlineIdServiceTicketRequest(“myapp.azurewebsites.net”、“JWT”);
var ticketRequests=new List(){mobileServicesTicket};
var authResult=等待验证者.AuthenticateUserAsync(ticketRequests,CredentialPrompType.PromptifNeed);
if((authResult.Tickets.Count==1)和&(authResult.Tickets[0].ErrorCode==0))
{
var accessToken=authResult.Tickets[0];
var token=new JObject();
添加(“authenticationToken”,accessToken.Value);
var_mobileServiceClient=ServiceLocator.Current.GetInstance();
var user=wait_mobileServiceClient.LoginAsync(MobileServiceAuthenticationProvider.MicrosoftAccount,令牌);
返回true;
}
其他的
{
返回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];
    }
publicstaticasync任务GetUserId(IPrincipal pricipal,HttpRequestMessage请求)
{         
ProviderCredentials credentials=await pricipal.GetAppServiceIdentityAsync(请求);
返回凭据。提供程序+:“+凭据。声明[ClaimTypes.NameIdentifier];
}
上面的索赔集合包含以下密钥:

版本、iss、exp、uid、aud、urn:microsoft:appuri、urn:microsoft:appid

其他一切似乎都起作用了。我可以使用我的MicrosoftAccount登录,也可以调用需要身份验证的方法,但我无法生成用户id

如何在索赔集合中获取NameIdentifier