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

问题描述 投票:0回答:1

我正在使用 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?

c# win-universal-app azure-web-app-service claims azure-mobile-services
1个回答
0
投票

试试这个:

var oid = claims.Where(x => x.Type == ClaimTypes.NameIdentifier).FirstOrDefault();
© www.soinside.com 2019 - 2024. All rights reserved.