使用 ASP.NET MVC 6 WebAPI 从 Auth0 获取用户信息
Get user information from Auth0 using ASP.NET MVC 6 WebAPI
我在我的 WebAPI(ASP.NET 核心 RC1)中使用 JwtBearerAuthentication 来验证访问我的 API 的 (Auth0) 用户。在 Startup.cs 中,我使用以下代码配置与 Auth0 的连接。我缺少什么来访问有关访问 API 的每个用户的用户信息?
app.UseJwtBearerAuthentication(options =>
{
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.Audience = clientId;
options.Authority = domain;
options.Events = new JwtBearerEvents
{
OnValidatedToken = context =>
{
var claimsIdentity = context.AuthenticationTicket.Principal.Identity as ClaimsIdentity;
claimsIdentity.AddClaim(new Claim("id_token",
context.Request.Headers["Authorization"][0].Substring(context.AuthenticationTicket.AuthenticationScheme.Length + 1)));
return Task.FromResult(0);
}
};
});
首先很抱歉,我给你的样本是在 RC2 中。我的计算机上没有 RC1,在安装 RC2 之后安装它不是我想冒的风险。如果您由于某种原因无法升级到 RC2,那么希望您可以将此示例改装为 RC1。
好的,所以首先要了解您可以检索的有关用户的信息将仅限于 JWT 中包含的信息,这一点很重要。因此,请务必在请求令牌时设置正确的范围。因此,例如,如果您想要用户的姓名和电子邮件地址,请务必将 scope
设置为 openid name email
。
好吧,如果你想访问OnTokenValidated
事件中的信息,那么你可以使用下面的代码:
var options = new JwtBearerOptions
{
Audience = Configuration["auth0:clientId"],
Authority = $"https://{Configuration["auth0:domain"]}/",
Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
// If you need the user's information for any reason at this point, you can get it by looking at the Claims property
// of context.Ticket.Principal.Identity
var claimsIdentity = context.Ticket.Principal.Identity as ClaimsIdentity;
if (claimsIdentity != null)
{
// Get the user's ID
string userId = claimsIdentity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
// Get the name
string name = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "name")?.Value;
}
return Task.FromResult(0);
}
}
};
app.UseJwtBearerAuthentication(options);
如果您想从控制器操作中访问信息,只需查看 User
的声明即可,例如
public class ValuesController : Controller
{
[Authorize]
[HttpGet]
[Route("userinfo")]
public object UserInformation()
{
string userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
// Get the name
string name = User.Claims.FirstOrDefault(c => c.Type == "name")?.Value;
return new
{
UserId = userId,
Name = name
};
}
}
如果您需要访问有关用户的更多信息,您还可以使用我们完整的 .NET SDK 进行管理 API 并使用与用户相关的方法来检索更多用户信息。然而,我的建议是确保您在颁发令牌时设置正确的范围,并确保它们包含在 JWT 令牌中。
完整示例可在 https://github.com/auth0-samples/auth0-aspnetcore-webapi-samples/tree/master/Samples/user-info
获得
我在我的 WebAPI(ASP.NET 核心 RC1)中使用 JwtBearerAuthentication 来验证访问我的 API 的 (Auth0) 用户。在 Startup.cs 中,我使用以下代码配置与 Auth0 的连接。我缺少什么来访问有关访问 API 的每个用户的用户信息?
app.UseJwtBearerAuthentication(options =>
{
options.AutomaticAuthenticate = true;
options.AutomaticChallenge = true;
options.Audience = clientId;
options.Authority = domain;
options.Events = new JwtBearerEvents
{
OnValidatedToken = context =>
{
var claimsIdentity = context.AuthenticationTicket.Principal.Identity as ClaimsIdentity;
claimsIdentity.AddClaim(new Claim("id_token",
context.Request.Headers["Authorization"][0].Substring(context.AuthenticationTicket.AuthenticationScheme.Length + 1)));
return Task.FromResult(0);
}
};
});
首先很抱歉,我给你的样本是在 RC2 中。我的计算机上没有 RC1,在安装 RC2 之后安装它不是我想冒的风险。如果您由于某种原因无法升级到 RC2,那么希望您可以将此示例改装为 RC1。
好的,所以首先要了解您可以检索的有关用户的信息将仅限于 JWT 中包含的信息,这一点很重要。因此,请务必在请求令牌时设置正确的范围。因此,例如,如果您想要用户的姓名和电子邮件地址,请务必将 scope
设置为 openid name email
。
好吧,如果你想访问OnTokenValidated
事件中的信息,那么你可以使用下面的代码:
var options = new JwtBearerOptions
{
Audience = Configuration["auth0:clientId"],
Authority = $"https://{Configuration["auth0:domain"]}/",
Events = new JwtBearerEvents
{
OnTokenValidated = context =>
{
// If you need the user's information for any reason at this point, you can get it by looking at the Claims property
// of context.Ticket.Principal.Identity
var claimsIdentity = context.Ticket.Principal.Identity as ClaimsIdentity;
if (claimsIdentity != null)
{
// Get the user's ID
string userId = claimsIdentity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
// Get the name
string name = claimsIdentity.Claims.FirstOrDefault(c => c.Type == "name")?.Value;
}
return Task.FromResult(0);
}
}
};
app.UseJwtBearerAuthentication(options);
如果您想从控制器操作中访问信息,只需查看 User
的声明即可,例如
public class ValuesController : Controller
{
[Authorize]
[HttpGet]
[Route("userinfo")]
public object UserInformation()
{
string userId = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
// Get the name
string name = User.Claims.FirstOrDefault(c => c.Type == "name")?.Value;
return new
{
UserId = userId,
Name = name
};
}
}
如果您需要访问有关用户的更多信息,您还可以使用我们完整的 .NET SDK 进行管理 API 并使用与用户相关的方法来检索更多用户信息。然而,我的建议是确保您在颁发令牌时设置正确的范围,并确保它们包含在 JWT 令牌中。
完整示例可在 https://github.com/auth0-samples/auth0-aspnetcore-webapi-samples/tree/master/Samples/user-info
获得