![](/img/trans.png)
[英]ASP.NET Core Access User.Identity in Controller Constructor
[英]Load JWT into User.Identity automatically (ASP.NET Core 3.1)
我正在開發一個具有微服務架構的項目。 I have one API Rest that works as an API Gateway where I want to get the username from a JSON Web Token. 可能需要注意的是,系統的身份驗證和授權正在系統的另一部分處理(我只需要獲取用戶名)。
到目前為止,我能夠使用 HttpContext 的擴展從 JWT 獲取用戶名:
public static class HttpContextExtensions
{
private static JwtSecurityToken GetJwt(this HttpContext httpContext)
{
bool existeToken = httpContext.Request.Headers.TryGetValue("Authorization", out StringValues authorizationValue);
if (!existeToken)
{
return null;
}
string encodedToken = authorizationValue.FirstOrDefault().Split(" ", 2)[1];
return new JwtSecurityTokenHandler().ReadJwtToken(encodedToken);
}
public static string GetUsername(this HttpContext httpContext)
{
JwtSecurityToken jwt = httpContext.GetJwt();
Claim usernameClaim = jwt.Claims.FirstOrDefault(c => c.Type == "preferred_username");
return usernameClaim?.Value;
}
}
然后我可以得到 controller 上的用戶名:
string username = HttpContext.GetUsername();
我想知道在.Net Core 3.1 上是否有更優雅的方法來執行此操作。 我嘗試配置我的項目,以便可以在控制器的操作中將所有聲明加載到 User.Identity 中,但我失敗了。 我找到的所有文檔都是關於以前版本的 .Net Core。
我想我可能在 Startup.cs 上做錯了什么。 如果有人能指出我正確的方向,我將不勝感激。
我通過在中間件中填充 HttpContext 上的用戶來做了一種方法:
public class AuthMiddleware
{
private readonly RequestDelegate _next;
public AuthMiddleware(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext context)
{
string authHeader = context.Request.Headers["Authorization"];
if (authHeader != null)
{
var jwtEncodedString = authHeader.Substring(7);
var token = new JwtSecurityToken(jwtEncodedString: jwtEncodedString);
var identity = new ClaimsIdentity(token.Claims, "basic");
context.User = new ClaimsPrincipal(identity);
}
return _next(context);
}
}
然后在應用程序設置上;
public static IApplicationBuilder UseApiConfiguration(this IApplicationBuilder app, IWebHostEnvironment env)
{
// add middleware reference
app.UseMiddleware<AuthMiddleware>();
return app;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.