gpt4 book ai didi

authentication - 将 IPrincipal 从 MVC 传递到 SignalR

转载 作者:行者123 更新时间:2023-12-01 04:59:51 24 4
gpt4 key购买 nike

我有一个 MVC 应用程序,它带有自定义主体的基于表单的身份验证。在使用应用程序之前用户必须登录。在此之后我想使用 SignalR,问题是 Context.User.Identity.Name 总是空字符串。

自定义主体.cs

public class CustomPrincipal : IPrincipal
{
public CustomPrincipal(IIdentity identity)
{
Identity = identity;
}

public IIdentity Identity { get; }

public bool IsInRole(string role)
{
return true;
}
}

自定义身份.cs

public class CustomIdentity : IIdentity
{
public CustomIdentity(EmployeeModel user)
{
Name = user.Username;
Id = user.Id;
}

public string AuthenticationType => "Custom";

public bool IsAuthenticated => !string.IsNullOrEmpty(Name);

public int Id { get; set; }

public string Name { get; }
}

BaseController.cs(我从中派生出我所有的 MVC Controller )

protected override void OnAuthorization(AuthorizationContext context)
{
if (SessionPersister.User != null && !string.IsNullOrEmpty(SessionPersister.User.Username))
{
context.HttpContext.User = new CustomPrincipal(new CustomIdentity(SessionPersister.User));
}

base.OnAuthorization(context);
}

这里的 SessionPersister 只是一个静态类,用于存储登录用户

因此,我的 MVC 应用程序中的所有内容都运行良好。当用户登录并且我想向另一个通过 SignalR 登录的用户发送消息时,Identity.User.Name 在我的 Hub 类中是一个空字符串的问题:

public override Task OnConnected()
{
string name = Context.User.Identity.Name; // it's empty

return base.OnConnected();
}

有什么方法可以将我的 MVC IPrincipal 传递给 SignalR 或将其配置为使用我在 MVC 中使用的自定义身份验证?

提前谢谢

最佳答案

所以,轻微的逻辑错误:
BaseController.OnAuthorization仅在执行 Controller 时触发。当 SignalR 请求通过时,将永远不会为该请求调用该方法。

因此,一种解决方法是将代码从 Controller 移动到更全局的范围。例如,您可以使用 Global.asax.cs并添加它,就像这样:

    protected void Application_PostAuthenticateRequest( object sender, EventArgs e )
{
//do your custom principal setting here.
this.Context.User = new CustomPrincipal( new CustomIdentity( 10, "test" ) );
}

然后,在您的集线器中,您将能够像这样看到身份:
    public String Hello(String hello)
{
//no need to actually cast if you don't need the non-iidentity properties
//var identity = (CustomIdentity) this.Context.User.Identity;
//identity.Id == 10
//identity.Name == "test"

return hello;
}

或者,我确定您可以在用户身份验证后将其放入 OWIN 管道中,而不是 Global.asax。但是,其他人需要提供一个确切的示例。

编辑:为了澄清,我更改了您的 CustomIdentity 的构造函数,因为我没有您的所有类。上面的这个例子只是概念的证明。

关于authentication - 将 IPrincipal 从 MVC 传递到 SignalR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33924027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com