Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Windows Metro应用程序中使用Windows Broker身份验证成功进行身份验证后获取用户信息_C#_Authentication_Windows Runtime - Fatal编程技术网

C# 在Windows Metro应用程序中使用Windows Broker身份验证成功进行身份验证后获取用户信息

C# 在Windows Metro应用程序中使用Windows Broker身份验证成功进行身份验证后获取用户信息,c#,authentication,windows-runtime,C#,Authentication,Windows Runtime,我正在进行Windows Broker身份验证。我可以成功地在呼叫应用中进行身份验证,并且在身份验证后可以返回主页 我无法获取用户信息(用户名)。我已尝试,但我收到一条如下所示的消息 mscorlib.dll中发生类型为“System.exception”的第一次意外异常 WinRT信息:响应状态代码不表示成功:401(未授权)。 其他信息:未经授权(401)。 响应状态代码不表示成功:401(未经授权)。 如果存在此异常的处理程序,则程序可以安全地继续 我已经在下面写了我的代码。请朋友们帮助我

我正在进行Windows Broker身份验证。我可以成功地在呼叫应用中进行身份验证,并且在身份验证后可以返回主页

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

mscorlib.dll中发生类型为“System.exception”的第一次意外异常 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;
        }

    }
private const string RESOURCE\u NAME=“id\u token”;
公共异步任务GetName(字符串accessToken)
{
尝试
{
var client=新的HttpClient();
client.DefaultRequestHeaders.Authorization=new Windows.Web.Http.Headers.HttpCredentialsHeaderValue(“OAuth”,accessToken);
var result=await client.GetStringAsync(新Uri(loginUri));
var profileInformation=JsonObject.Parse(result.GetObject();
var name=profileInformation.GetNamedString(“用户名”);
返回新的UserInfo{Name=Name};
}
捕获(JsonException ex)
{
抛出新的JsonException(例如message);
}
}  
私有异步无效btnHomeLogin\u单击(对象发送方,路由目标)
{
string Scope=“openid profile”;
var client=新的OAuth2Client(新的Uri(loginUri));
var startUri=client.CreateAuthorizeUrl(
ClientID,
资源名称,
范围
乌里,
国家,,
暂时);
字符串验证结果;
尝试
{
var webAuthenticationResult=等待WebAuthenticationBroker.authenticateSync(WebAuthenticationOptions.None、新Uri(startUri)、新Uri(RedirectURI));
开关(webAuthenticationResult.ResponseStatus)
{
案例Windows.Security.Authentication.Web.WebAuthenticationStatus.Success:
//成功的身份验证。
Authresult=webAuthenticationResult.ResponseData.ToString();
UserInfo UserInfo=await GetName(资源名称);
打破
案例Windows.Security.Authentication.Web.WebAuthenticationStatus.ErrorHttp:
//HTTP错误。
Authresult=webAuthenticationResult.ResponseErrorDetail.ToString();
打破
违约:
//其他错误。
Authresult=webAuthenticationResult.ResponseData.ToString();
打破
}
}
捕获(例外情况除外)
{
//身份验证失败。此处处理参数、SSL/TLS和网络不可用错误。
Authresult=ex.消息;
}
}

如果您正使用上述代码,那么基于上述情况,您将使用常量字符串(资源名称)而不是webAuthenticationResult返回的实际AuthResult(accessToken)调用GetName函数。如果调用WebAuthenticationBroker的目的是获取一个访问令牌,该令牌稍后将与HttpClient一起使用,那么您需要相应地调整代码,并在调用HttpClient代码时使用正确的访问令牌。否则,如果您没有传递正确的代币,401也不是意外的。

嗨,Prasant,谢谢您的帮助。我可以使用该访问令牌(RESOURCE_NAME)成功进行身份验证。但在成功登录后,我无法获取登录的用户信息(用户名、电子邮件id…),并返回到我的主页,返回用户信息。希望您能为我提供一些帮助提示/建议。如果HttpClient请求返回401错误,则表示您没有使用正确的身份验证头,并且服务器上的访问被拒绝。这意味着您没有可以解析/正在寻找的响应。如果您可以使用诸如Fiddler之类的工具模拟成功的请求,我建议您首先从一个正常工作的HTTP请求开始,了解请求头是什么样子的——特别是HTTP授权头的格式,然后使用该原始HTTP请求重新创建您的HttpClient请求。