我正在开发ASP .Net Core 1.1 MVC Web应用程序,该应用程序使用“授权代码授予流程”调用Web API。我正在使用Auth0作为身份验证服务器。
按照Auth0教程,在用户成功登录到Web应用程序之后,现在做了一些使Web应用程序调用Web api的操作,它说我应该按以下方式获取访问令牌:
public async Task<IActionResult> Index()
{
string accessToken = User.Claims.FirstOrDefault("access_token")?.Value;
if (accessToken == "")
return View("Error");
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
HttpResponseMessage responseMessage = await client.GetAsync(inspectionsUrl);
if (responseMessage.IsSuccessStatusCode)
{
var responseData = responseMessage.Content.ReadAsStringAsync().Result;
List<Inspection> inspections = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Inspection>>(responseData);
return View(inspections);
}
return View("Error");
}
但是,它甚至没有编译,给出以下内容
Argument 2: cannot convert from 'string' to 'System.Func <System.Security.Claims.Claim, bool>'
有什么想法吗?
第一行应该是:
string accessToken = User.Claims.FirstOrDefault(c => c.Type == "access_token")?.Value;
目前,您正在尝试将"access_token"
用作FirstOrDefault
的参数,这将不起作用。您必须指定一个谓词。
您可以编写扩展名并使用更优雅的方式来获取访问令牌:
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
如果您需要在WebAPI Controller函数中解码令牌,我发现此方法有效:
String token = Request.Headers.Authorization.Parameter;
Microsoft.Owin.Security.AuthenticationTicket t = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token);