从访问控制名称空间声明中返回Windows Live ID电子邮件地址

时间:2014-08-02 15:27:34

标签: claims-based-identity access-control windows-live-id

我一直在为身份提供商的azure应用程序配置访问控制命名空间,并且能够使用他们的声明令牌从Google和Yahoo返回一个电子邮件地址,但使用Windows Live ID,我能找到的唯一识别值是这个:

http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: gX5FDH7dCnWGUfe46CwiCSvRUosc2aM7kmMHBnjQOxM=

我知道这代表了电子邮件地址,但我无法知道' gX5FDH7dCnWGUfe46CwiCSvRUosc2aM7kmMHBnjQOxM = '与用户注册时我的数据库中的emailaddress存储值有关,这导致我无法找到用户的YSoD。我阅读了一些内容,可以使用Windows Live Connect工具将其转换为电子邮件地址,但我无法找到任何进一步的信息。

任何人都知道如何在c#代码后面做到这一点?

1 个答案:

答案 0 :(得分:0)

似乎有一些代码示例可供您查找:

http://msdn.microsoft.com/en-us/library/hh243641.aspx

我认为您需要为 wl.basic 范围请求令牌,以获取包含用户电子邮件地址声明的访问令牌。

所以根据链接,一种方法是这样的:

private async void btnGreetUser_Click(object sender, RoutedEventArgs e)
{
    try
    {
        LiveAuthClient auth = new LiveAuthClient();
        LiveLoginResult initializeResult = await auth.InitializeAsync();
        try
        {
            LiveLoginResult loginResult = await auth.LoginAsync(new string[] { "wl.basic" });
            if (loginResult.Status == LiveConnectSessionStatus.Connected)
            {
                LiveConnectClient connect = new LiveConnectClient(auth.Session);
                LiveOperationResult operationResult = await connect.GetAsync("me");
                dynamic result = operationResult.Result;
                if (result != null)
                {
                    this.infoTextBlock.Text = string.Join(" ", "Hello", result.name, "!");
                }
                else
                {
                    this.infoTextBlock.Text = "Error getting name.";
                }
            }
        }
        catch (LiveAuthException exception)
        {
            this.infoTextBlock.Text = "Error signing in: " + exception.Message;
        }
        catch (LiveConnectException exception)
        {
            this.infoTextBlock.Text = "Error calling API: " + exception.Message;
        }
    }
    catch (LiveAuthException exception)
    {
        this.infoTextBlock.Text = "Error initializing: " + exception.Message;
    }
}

因此,您将范围作为字符串数组传递,而不是使用wl.basic范围(wl.emails范围)来访问电子邮件信息,请参阅:

http://msdn.microsoft.com/en-us/library/hh243646.aspx#wlemails