我在 Blazor 服务器应用程序中使用 SignalR。我添加了services.AddSignalR()
在startup.cs文件中。那我就拿不到token了。因为http上下文是null
。然后我删除了services.AddSignalR()
来自startup.cs 文件。这是正常工作。然后我可以从http客户端获取令牌。怎么解决呢?
谢谢。
Startup.cs文件:
services
.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.Authority = identityUrl.ToString();
options.SignedOutRedirectUri = callBackUrl.ToString();
options.ClientId = useLoadTest ? "mvctest" : "blazor";
options.ClientSecret = "secret";
options.ResponseType = useLoadTest ? "code id_token token" : "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.RequireHttpsMetadata = false;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("post");
options.Scope.Add("family");
options.Scope.Add("webpostagg");
});
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSignalR();
services.AddHttpClient<IPostService, PostService>()
.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>();
HttpClientAuthorizationDelegatingHandler.cs:
public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccesor)
{
_httpContextAccesor = httpContextAccesor;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
string authorizationHeader;
if (_httpContextAccesor.HttpContext == null)
{
authorizationHeader = string.Empty;
}
else
{
authorizationHeader = _httpContextAccesor.HttpContext
.Request.Headers["Authorization"];
}
if (!string.IsNullOrEmpty(authorizationHeader))
{
request.Headers.Add("Authorization", new List<string>() { authorizationHeader });
}
var token = await GetToken();
if (token != null)
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
return await base.SendAsync(request, cancellationToken);
}
public async Task<string> GetToken()
{
const string ACCESS_TOKEN = "access_token";
return await _httpContextAccesor.HttpContext
.GetTokenAsync(ACCESS_TOKEN);
}
请不要在 Server Blazor 应用程序中使用 HttpContext。这是不可用的。服务器端 Blazor 基于 WebSocket,而不是基于 HTTP 请求。只是不要那样做。
以下是我关于如何实施 OpenID Connect 的答案以及其他答案的链接,您可以在其中找到问题的答案。
看看这些:如何在没有微软身份的情况下进行 jwt 身份验证 Blazor 服务器?
如何从 blazor(服务器端)Web 应用程序获取访问令牌?
如何通过 IdentityServer4 将 OpenId Connect 添加到 ASP.NET Core 服务器端 Blazor Web 应用程序?
如何从 asp.net web api 中的身份声明获取经过 JWT 身份验证的登录用户
如何在服务器端 Blazor 中使用 HttpContext 对象检索有关用户、用户代理的信息
Blazor 添加 HttpClientHandler 以将 Jwt 添加到请求的 HTTP 标头
Blazor:没有会话/JWT 令牌时重定向到登录页面?
注意:还有更多与 Jwt、OpenID Connect 等相关的答案,您只需寻找它们即可
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)