我在检索经过身份验证的用户的访问令牌方面遇到了问题。下面是我的配置
ASP.NET MVC 5客户端:
ASP.NET核心身份服务器:
我试图使用以下方法在我的客户端获取访问令牌:
AuthorizationCodeReceived = async n =>
{
// use the code to get the access and refresh token
var tokenClient = new TokenClient(TokenEndpoint, "clientid", "secret");
var response = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);
},
我将此参考用于上述实施 - https://github.com/IdentityServer/IdentityServer3/issues/2457
但response
中的属性具有空值。我需要访问令牌,以便登录客户端的用户可以访问api。以下是我尝试检索访问令牌的另一种方式:
public async Task<ActionResult> CallApiUsingUserAccessToken()
{
var user = User as ClaimsPrincipal;
var accessToken = user.FindFirst("access_token").Value;
var client = new HttpClient();
client.SetBearerToken(accessToken);
var content = await client.GetStringAsync("http://localhost:6001/api/values");
ViewBag.Json = JArray.Parse(content).ToString();
return View("json");
}
但是,user.FindFirst("access_token").Value;
为空。我正在考虑将我的MVC客户端迁移到Core,因为我已经在asp.net核心中尝试过IdentityServer4版本,但这似乎是我的一大迁移。谢谢。
[更新]
我从未想到IdentityServer3中的端点与IDS4不同。我必须将var tokenClient = new TokenClient(TokenEndpoint, "client", "secret");
更改为var tokenClient = new TokenClient("http://localhost:9000/connect/token", "client", "secret")
,因为IDS3中的TokenEndpoint是http://localhost:9000/core/connect/token,其中端点&#34;核心&#34}在IDS4中不存在。我可以在此行var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);
中获取访问令牌,但在授权后,我仍然会在此var accessToken = user.FindFirst("access_token").Value;
代码行中获得空引用异常。
答案 0 :(得分:1)
鉴于
上的IdentityServer 4文档 的示例客户端您应该能够设置工作环境。
为了支持调试,您应始终进行正确的响应处理,如下例和copied from example client所示。在您的问题中添加任何回复错误。
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthorizationCodeReceived = async n =>
{
// use the code to get the access and refresh token
var tokenClient = new TokenClient(
Constants.TokenEndpoint,
"mvc.owin.hybrid",
"secret");
var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(
n.Code, n.RedirectUri);
if (tokenResponse.IsError)
{
throw new Exception(tokenResponse.Error);
}
最后,我建议为基于IdentityServer3 / 4的设置的所有重要部分添加代码 - 因为事实通常都隐藏在细节中。
答案 1 :(得分:0)