如何在 Blazor 服务器应用程序中使用信号器从 http 客户端获取令牌?

2023-12-03

我在 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(使用前将#替换为@)

如何在 Blazor 服务器应用程序中使用信号器从 http 客户端获取令牌? 的相关文章

  • @code 内部的代码在 blazor 服务器端的哪里运行?

    这可能是一个愚蠢的问题 但我试图阅读更多有关 Blazor 的内容 但我总是感到困惑 code 据我了解 当你使用 code在客户端 blazor 内部 所有内容都在客户端浏览器本地运行 所以我有几个问题 当您使用 blazor 服务器端时
  • SignalR 1.01 中不需要 MapHub?

    我正在遵循 Signalr Wiki 中的集线器快速入门指南 我在 Global asax Application Start 行 RouteTable Routes MapHubs 上收到错误 名为 signalr hubs 的路由已在路
  • IClaimsTransformation 未触发

    我尝试过实施一个IClaimsTransformation我在 ASP NET CORE 3 1 Web 应用程序中找到的类 public class ClaimsTransformer IClaimsTransformation publ
  • 如何从任何类 blazor 服务器端读取 appsetting.json

    我知道如何从 razor 组件访问 appsettings json 但如何从 blazor 服务器端项目中的任何类访问 从剃刀组件我只需注入 注入IConfiguration config 并访问我需要的所有内容 例如 config Ge
  • .Net Core Nuget Package - 将文件复制到包消费者 wwwroot

    我有一个 Net Core 2 2 库项目 该项目包含的所有内容都是一堆静态文件 其中 构建操作 设置为内容 该项目的唯一目的是构建到 Nuget 包中 并让任何消费者将包含的内容添加到他们的wwwroot folder 不幸的是 当查看解
  • Set-Cookie 在 Chrome 中不起作用

    我有一个奇怪的问题 我开发的网站之一在请求登录页面时返回防伪 cookie 当我检查 chrome 网络选项卡中的响应时 它包含标头 Set Cookie AspNetCore Antiforgery w5W7x28NAIs xxx pat
  • 如何使用不同的基本路径托管 Blazor WebAssembly 应用程序

    我有一个 Blazor Webassemble NET 托管应用程序 在我们托管它的服务器上 应用程序的基本路径将是mydomain com coolapp 因此 为了尝试让应用程序在服务器上正确呈现 我一直遵循本页 应用程序基本路径 部分
  • Windows 7 中的 VS2017“尝试确定 dotnet.exe 的进程 ID 时发生错误”

    项目属性 gt 启用 SSL false 关闭 选择 IIS Express 作为调试选项 已安装 IIS 10 0 Express 总是低于错误 任何人都可以建议修复吗 已经尝试过以下网址 但仍然没有希望 尝试确定托管您的应用程序的 do
  • 参数绑定到 ASP.NET MVC Core 中的路由或查询字符串

    我正在将 ASP NET MVC NET Framework Web 应用程序迁移到 ASP NET MVC Core 3 1 该应用程序是公司内部的 我们正在借此机会清理一些 API 路由 使它们更加 RESTful 例如 api Val
  • 如何更改.net core的URL后缀?

    我怎样才能有以下路线 http localhost 4413 abc 以及以下路线 http localhost 4413 abc html 两者都返回相同的控制器方法 使用 NET Core MVC 听起来您想要两个后缀来达到相同的控制器
  • 不支持的媒体类型 ASP.NET Core Web API

    在前端 我使用 Angular 从表单收集一些数据并将其发送到我的服务器端控制器 如下图所示 我在控制器和服务上获取数据 scope newData 但是当它到达服务器时 我收到以下错误 不支持的媒体类型 并且我的 newData 为空 我
  • 如何在 ASP.NET Core-SPA 应用程序上禁用服务器端渲染?

    我正在使用 aspnetcore spa react redux 样板构建我的应用程序 可以在http blog stevensanderson com 2016 05 02 angular2 react knockout apps on
  • system.web.http.HttpError 的.Net 标准/核心版本

    从 net Framework 迁移到 net Standard Core 时 我遇到了 HttpError 类 除了兼容性垫片之外 我在 net core standard 中找不到任何等效项 这只是一个临时解决方案 不知道官方有没有替代
  • 使用signinmanager成功登录后,用户仍然显示为已注销?

    我已将 Asp Net 身份框架添加到从前端调用的 WebAPI 中 注册帐户后 并看到它在数据库中正确显示 我使用该用户的用户名和密码登录 结果成功 但根据登录管理器 用户未登录 我尝试使用 cookie 身份验证使用此示例 https
  • 使用信号器时会话超时

    我有一个网络应用程序 主要用于监控系统 它使用信号器从服务器 服务器推送 更新来刷新显示 该页面还有一些按钮 它们也使用相同的信号器连接将数据发送到服务器 问题是 signalr 使用单独的连接 因此即使它定期从服务器发送和接收数据 会话也
  • .NET7 Web API 中的 JSON 多态序列化

    NET7 包括许多改进System Text Json序列化器 其中之一是使用新的类型的多态序列化 JsonPolymorphic 属性 我正在尝试在我的 Asp Net Web API 中使用它 但是尽管模型已正确设置 但它似乎并未序列化
  • 在 ASP.Net Core 应用程序中动态更改 SQL Server 连接字符串

    我一开始打开一个数据库 然后需要根据用户选择两个值打开另一个数据库 数据库选择必须在运行时进行 并且每次都会改变 尝试使用连接字符串类访问连接字符串 并尝试了其他选项 例如我不理解的单例 我在运行 SQL Server Express 的本
  • Blazor WebAssembly 反序列化比下载慢很多?怎么了?

    在我的 Blazor 应用程序中 我有一个具有类似方法的组件 我已将 GetFromJsonAsync 调用替换为其中的代码 以缩小缓慢部分的范围 private async Task GetData IsLoading true stri
  • 在 ASP.NET Core 的中间件中注入服务

    我想根据 HTTP 标头值注入服务 所以我有 2 个类 DbDataProvider 和 InMemDataProvider 它们都是从 IDataProvider 实现的 每当进行 API 调用时 客户端都会传递一个标头 该标头确定是需要
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List

随机推荐