C# 我可以在同一URL路径上使用OWIN身份验证和信号器吗?(例如,一次呼叫中的信号机和身份验证)
SignalR允许我像这样将凭证直接添加到它的API中C# 我可以在同一URL路径上使用OWIN身份验证和信号器吗?(例如,一次呼叫中的信号机和身份验证),c#,asp.net,authentication,signalr,owin,C#,Asp.net,Authentication,Signalr,Owin,SignalR允许我像这样将凭证直接添加到它的API中 objConnection.AddClientCertificate = ; objConnection.Credentials = ; 但是,我没有使用证书或其他网络凭据。我正在使用一对自定义密钥。我还想连接到信号集线器,并在一次尝试中进行身份验证 现在,我的初创公司是这样的: public static class Startup { public static void Configurati
objConnection.AddClientCertificate = ;
objConnection.Credentials = ;
但是,我没有使用证书或其他网络凭据。我正在使用一对自定义密钥。我还想连接到信号集线器,并在一次尝试中进行身份验证
现在,我的初创公司是这样的:
public static class Startup
{
public static void Configuration(IAppBuilder app)
{
ConfigureSignalR(app);
}
public static void ConfigureSignalR(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.Map(("/login"), map =>
{
map.Run(async context =>
{
var token1 = context.Request.Headers["Token"];
// if token is valid...
var identity = new ClaimsIdentity("Custom" );
identity.AddClaim("Token", token1);
context.Authentication.SignIn(identity);
});
});
HubConfiguration config = new HubConfiguration();
config.EnableJSONP = false;
config.EnableJavaScriptProxies = true;
config.EnableDetailedErrors = true;
app.MapSignalR(config);
}
我想将上面的Context.Authentication.SignIn()
移动到下面的方法,但是中心不会向我公开这些头更正中心不向我公开上下文。身份验证
[HubName("stockTicker")]
public class StockTickerHub : Hub
{
private readonly StockTicker _stockTicker;
public override System.Threading.Tasks.Task OnConnected()
{
// TODO READ HEADERS AND AUTHENTICATE
我的目标是,当我的C#client登录(见下图)时,我可以打开信号器连接,并在一次尝试中进行身份验证
class Program
{
static HubConnection objConnection = new HubConnection("http://localhost:10028/", "DataFrom=0");
static void Main(string[] args)
{
objConnection.Headers.Add("Token", "a TOKEN GOES HERE.. blah");
IHubProxy proxy = objConnection.CreateHubProxy("stockTicker");
try
{
objConnection.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
proxy.On<Microsoft.AspNet.SignalR.StockTicker.Stock>("updateStockPrice", customObject =>
{
Console.WriteLine(customObject.Symbol + " " + customObject.Price);
});
Console.Write("wait");
Console.ReadLine();
类程序
{
静态轮毂连接objConnection=新轮毂连接(“http://localhost:10028/“,“DataFrom=0”);
静态void Main(字符串[]参数)
{
添加(“Token”,“这里有一个Token..blah”);
IHubProxy=objConnection.CreateHubProxy(“stockTicker”);
尝试
{
objConnection.Start();
}
捕获(例外e)
{
控制台写入线(e.Message);
}
On(“updateStockPrice”,customObject=>
{
Console.WriteLine(customObject.Symbol+“”+customObject.Price);
});
控制台。写入(“等待”);
Console.ReadLine();
如果我无法完成一次呼叫信号器连接和身份验证,C#client应如何将身份验证“转移”到信号器呼叫中,我认为这将使用cookie验证身份。您最好的选择可能是创建一个验证客户端是否有正确的声明来访问您的集线器。例如:
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
{
return IsValid(request.Headers["Token"]);
}
private static bool IsValid(string token)
{
// ...
}
}
[HubName("stockTicker")]
[MyAuthorize]
public class StockTickerHub : Hub
{
// ...
}
也可以验证索赔实体
,但这需要客户端上的额外代码来检索cookie:
// Server
using System.Security.Claims;
using System.Security.Principal;
using Microsoft.AspNet.SignalR;
public class AuthorizeClaimsAttribute : AuthorizeAttribute
{
protected override bool UserAuthorized(IPrincipal user)
{
var principal = user as ClaimsPrincipal;
return principal != null && principal.HasClaim("Token", "value");
}
}
[HubName("stockTicker")]
[AuthorizeClaims]
public class StockTickerHub : Hub
{
// ...
}
// Client
var handler = new HttpClientHandler();
handler.CookieContainer = new CookieContainer();
using (var httpClient = new HttpClient(handler))
{
httpClient.DefaultRequestHeaders.Add("Token", "a TOKEN GOES HERE.. blah");
await httpClient.GetAsync(url + "/login");
}
objConnection.CookieContainer = handler.CookieContainer;
IHubProxy proxy = objConnection.CreateHubProxy("stockTicker");
await objConnection.Start();
创建自定义属性后,应将其附加到中心类