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