首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将.NET Core2.1 SignalR控制台客户端身份验证到使用“身份作为UI”的web应用程序

将.NET Core2.1 SignalR控制台客户端身份验证到使用“身份作为UI”的web应用程序
EN

Stack Overflow用户
提问于 2018-06-08 11:02:09
回答 1查看 1.6K关注 0票数 4

使用.NET Core2.1& VS2017预览版2,我创建了一个简单的web服务器,使用here解释的"Identity as UI“,然后在this后面添加了一个SignalR聊天。

特别是我有:

代码语言:javascript
复制
app.UseAuthentication();
app.UseSignalR((options) => {
    options.MapHub<MyHub>("/hubs/myhub");
});

..

[Authorize]
public class MyHub : Hub

..

"iisSettings": {
  "windowsAuthentication": false,
  "anonymousAuthentication": true,
     "iisExpress": {
     "applicationUrl": "http://localhost:5000",
     "sslPort": 0

我启动调试器,打开浏览器,注册用户并登录,然后转到http://localhost:5000/SignalRtest (我使用signalr.js的剃刀页面)并验证聊天是否正常。

我现在尝试创建一个.NET核心控制台应用程序聊天客户端:

代码语言:javascript
复制
class Program
{
    public static async Task SetupSignalRHubAsync()
    {
        var hubConnection = new HubConnectionBuilder()
                    .WithUrl("http://localhost:5000/hubs/myhub")
                    .Build();

        await hubConnection.StartAsync();
        await hubConnection.SendAsync("Send", "consoleapp");
    }

    public static void Main(string[] args)
    {
        SetupSignalRHubAsync().Wait();
    }
}

我的问题是我不知道如何认证这个客户端?

编辑:

(来自https://github.com/aspnet/SignalR/issues/2455)

“它在浏览器中工作的原因是因为浏览器有一个cookie,当你登录时,它会自动发送它,当SignalR发出请求时。要在.NET客户端中做类似的事情,你必须在服务器上调用一个REST API来设置Cookie,从HttpClient中获取cookie,然后在对.WithUrl的调用中提供它,如下所示:

var loginCookie = /*获取cookie */ var hubConnection = new HubConnectionBuilder() .WithUrl("http://localhost:5000/hubs/myhub",options => { options.Cookies.Add(loginCookie);}) .Build();

我现在悬赏这个问题,希望得到一个解决方案,展示如何使用“身份即UI”的.NET Core2.1 web应用程序SignalR服务器对.NET Core2.1 web控制台客户端进行身份验证。我需要从服务器获取cookie,然后将其添加到SignalR HubConnectionBuilder (现在有一个WithCookie方法)。

请注意,我不是在寻找像IdentityServer这样的第三方解决方案,谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-09 07:52:50

我最终让它像这样工作:

在服务器上,我脚手架登录,然后在Login.cshtml.cs中添加

代码语言:javascript
复制
[AllowAnonymous]
[IgnoreAntiforgeryToken(Order = 1001)]
public class LoginModel : PageModel

也就是说,我在登录时不需要防伪令牌(这无论如何都没有意义)

然后客户端代码如下所示:

代码语言:javascript
复制
HttpClientHandler handler = new HttpClientHandler();
CookieContainer cookies = new CookieContainer();
handler.CookieContainer = cookies;
HttpClient client = new HttpClient(handler);

var uri = new Uri("http://localhost:5000/Identity/Account/Login");
string jsonInString = "Input.Email=myemail&Input.Password=mypassword&Input.RememberMe=false";
HttpResponseMessage response = await client.PostAsync(uri, new StringContent(jsonInString, System.Text.Encoding.UTF8, "application/x-www-form-urlencoded"));
var responseCookies = cookies.GetCookies(uri);
var authCookie = responseCookies[".AspNetCore.Identity.Application"];

var hubConnection = new HubConnectionBuilder()
        .WithUrl("http://localhost:5000/hubs/myhub", options =>
        {
            options.Cookies.Add(authCookie);
        })
        .Build();

await hubConnection.StartAsync();
await hubConnection.SendAsync("Send", "hello!");

(当然,密码将在部署中的其他位置)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50752724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档