使用Windows Metro App中的Windows Broker身份验证成功进行身份验证后获取用户信息

时间:2015-04-28 05:01:12

标签: c# authentication windows-runtime

我正在进行Windows Broker身份验证。我可以成功验证调用应用程序,并可以在身份验证后返回主页。

我无法获取用户信息(用户名)。我尝试过,但收到一条消息,如下所示。

类型' System.Exception'的第一次机会异常发生在mscorlib.dll中 WinRT信息:响应状态代码不表示成功:401(未授权)。 附加信息:未经授权(401)。 响应状态代码不表示成功:401(未授权)。 如果存在此异常的处理程序,则可以安全地继续该程序。

我在下面写了我的代码。请朋友帮助我。

  private const string RESOURCE_NAME ="id_token";

  public async Task<UserInfo> GetName(string accessToken)
        {
            try
            {
                var client = new HttpClient();

                client.DefaultRequestHeaders.Authorization = new Windows.Web.Http.Headers.HttpCredentialsHeaderValue("OAuth", accessToken);

                var result = await client.GetStringAsync(new Uri(loginUri));

                var profileInformation =JsonObject.Parse(result).GetObject();

                var name = profileInformation.GetNamedString("username");
                return new UserInfo { Name = name };
            }

            catch (JsonException ex)
            {
                throw new JsonException(ex.message);
            }




        }  

  private async void btnHomeLogin_Click(object sender, RoutedEventArgs e)
    {
        string Scope = "openid profile";
        var client = new OAuth2Client(new Uri(loginUri));

        var startUri = client.CreateAuthorizeUrl(
            ClientID,
            RESOURCE_NAME,
            Scope,
            RedirectURI, 
            state,
            nonce);
        string Authresult;
        try
        {
            var webAuthenticationResult = await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.None, new Uri(startUri),new Uri(RedirectURI));

            switch (webAuthenticationResult.ResponseStatus)
            {
                case Windows.Security.Authentication.Web.WebAuthenticationStatus.Success:
                    //Successful authentication.
                    Authresult = webAuthenticationResult.ResponseData.ToString();

                    UserInfo userInfo = await GetName(RESOURCE_NAME);


                    break;
                case Windows.Security.Authentication.Web.WebAuthenticationStatus.ErrorHttp:
                    //HTTP error.
                    Authresult = webAuthenticationResult.ResponseErrorDetail.ToString();
                    break;
                default:
                    //Other error.
                    Authresult = webAuthenticationResult.ResponseData.ToString();
                    break;
            }
        }
        catch (Exception ex)
        {
            //Authentication failed. Handle parameter, SSL/TLS, and Network Unavailable errors here. 
            Authresult = ex.Message;
        }

    }

1 个答案:

答案 0 :(得分:0)

如果您正在使用上面的代码,那么基于上面的代码,您使用常量字符串(RESOURCE_NAME)调用GetName函数,而不是从webAuthenticationResult返回的实际AuthResult(accessToken)。如果调用WebAuthenticationBroker的意图是返回一个稍后应该与HttpClient一起使用的访问令牌,那么您需要相应地调整代码并在调用HttpClient代码时使用正确的访问令牌。否则,如果您没有传递正确的令牌,则401不会出现意外。