使用OnlineIdAuthenticator在Azure应用服务中获取NameIdentifier声明

时间:2016-04-18 20:52:30

标签: c# win-universal-app azure-web-sites claims azure-mobile-services

我使用OnlineIdAuthenticator类来获取身份验证令牌以登录Azure App Services,但我无法获取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];
    }

上面的声明集合包含以下键:

ver,iss,exp,uid,aud,urn:microsoft:appuri,urn:microsoft:appid

其他一切似乎都有效。我可以使用我的MicrosoftAccount登录,我可以调用需要身份验证的方法,但我只是无法生成用户ID。

如何在Claims集合中获取NameIdentifier?

0 个答案:

没有答案