使用.NET Core2.1& VS2017预览版2,我创建了一个简单的web服务器,使用here解释的"Identity as UI“,然后在this后面添加了一个SignalR聊天。
特别是我有:
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核心控制台应用程序聊天客户端:
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这样的第三方解决方案,谢谢!
发布于 2018-06-09 07:52:50
我最终让它像这样工作:
在服务器上,我脚手架登录,然后在Login.cshtml.cs中添加
[AllowAnonymous]
[IgnoreAntiforgeryToken(Order = 1001)]
public class LoginModel : PageModel
也就是说,我在登录时不需要防伪令牌(这无论如何都没有意义)
然后客户端代码如下所示:
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!");
(当然,密码将在部署中的其他位置)
https://stackoverflow.com/questions/50752724
复制相似问题