如何在控制器外部獲取 OpenIdConnect 提供程式回傳的 id_token。
在控制器內部,這給了我令牌:
string idToken = await HttpContext.GetTokenAsync("id_token");
我需要以類似的方式在服務中獲取令牌。我怎樣才能做到這一點?
PS:我已經嘗試過使用 HttpContextAccessor 但它沒有回傳任何東西。
uj5u.com熱心網友回復:
使用 Session 存盤資料/值,可以在專案中的不同位置使用。
//store vaule
Session["idToken"] = await HttpContext.GetTokenAsync("id_token");
//Call session
var x = Session["idToken"];
//empty or clean Session value
Session["idToken"] = null;
uj5u.com熱心網友回復:
它似乎GetTokenAsync()是 httpContext 的擴展方法。如果這是真的,那么您可以在啟動/頂級 program.cs 中添加 HttpContextAccessor(取決于您使用的是 .net 5 還是 6)
builder.Services.AddHttpContextAccessor();
//or
services.AddHttpContext();
然后在你的課堂上,你可以走眾所周知的 DI 路線:
public class MyService : IMyService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public MyService(IHttpContextAccessor httpContextAccessor) =>
_httpContextAccessor = httpContextAccessor;
public async Task DoSomething() {
var idtoken = await _httpContextAccessor.HttpContext.GetTokenAsync("id_token");
}
}
檔案:https ://docs.microsoft.com/de-de/aspnet/core/fundamentals/http-context?view=aspnetcore-6.0
uj5u.com熱心網友回復:
作為 Marco 答案的變體,您通常使用過濾器/中間件中的令牌,然后將宣告注入您的服務類:
- 網站將使用 ID 令牌宣告作為宣告主體
- Web API 將使用訪問令牌宣告作為宣告主體
您可以在啟動時使 ClaimsPrincipal 可注入,并注意這是每個請求的依賴項:
this.services.AddScoped(ctx => ctx.GetService<IHttpContextAccessor>().HttpContext.User);
這使您能夠將 ClaimsPrincipal 類注入到 Service 類中,就像我的 API 代碼中一樣,因此它不需要了解 HTTP,只需要了解宣告。在我的示例中,服務類也是請求范圍的,并且應用了一些基于宣告的授權規則。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/428784.html
標籤:asp.net-mvc asp.net 核心 开放式连接 http上下文
