将SignalR添加到现有的IdentityServer4授权中

时间:2018-12-20 07:50:44

标签: asp.net-core identityserver4 asp.net-core-signalr

我有一个Asp.Net核心2.2 IdentityServer4应用程序,其工作系统支持声明等。我向其中添加SignalR,并希望使用[Authenitcation]标头并可以访问控制器具有的相同声明。

我找到了几篇有关将SignalR与IdentityServer4集成的文章,但是我无法确定与我已经在做的事情有什么重叠,以及增加对SignalR的支持所必需的。我只需要通知IdentityServer特定的SignalR路由进行授权?

这是一篇详尽的文章,其中包含有关GitHub的广泛示例: https://mikebridge.github.io/articles/identityserver4-signalr/ https://github.com/mikebridge/IdentityServer4SignalR

1 个答案:

答案 0 :(得分:0)

我最终重新使用了IdentityServer4的用法来创建jwtbearer令牌,并使用HybridAndClientCredentials,并且在我的Signalr会话开始事件中提取了User声明。

将Hybrid Client添加到IdentityServer4:

findByOwnerIdAndName
findTop1000ByOwnerIdAndName

,然后在mvc客户端上启动:

        new Client
        {
            ClientId = "mvc",
            ClientName = "MVC Client",
            AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

            ClientSecrets = 
            {
                new Secret("secret".Sha256())
            },

            RedirectUris = { "http://localhost:5002/signin-oidc" },
            PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },

            AllowedScopes = 
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile,
                "api1"
            },
            AllowOfflineAccess = true
        }

这是根据示例进行建模的: Quickstart5_HybridAndApi

在服务器上的SignalR中:

 ServiceCollection.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "https://localhost:5001";
                options.RequireHttpsMetadata = false;
                options.ClientSecret = "secret";
                options.ClientId = "mvc";

                options.ResponseType = "code id_token";
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("offline_access");
                options.Scope.Add("api1");
                options.ClaimActions.MapJsonKey("website", "website"); 
            });