0

在 XSockets 控制器内部,我需要调用在其方法上具有 PrincipalPermissions 属性的 Api(Assembly),并且不知道它正在运行的主机(也可以在批处理、WebApi 控制器等中调用...)我了解 XScockets 在其自己的 ConnectionContext 对象及其自定义 Authorize 属性中存储身份/主体,控制器 OnAuthorization 方法使用该属性。

问题是是否可以使用具有主体权限的现有代码,因此它总是从调用者上下文中获得正确的角色。

我想到了两个选择:

1)在我的身份验证管道中切换线程主体,因此 ConnectionContext 和当前线程具有相同的主体:

    var identity = new GenericIdentity(authenticationTicket.Name);
    string[] roles = authenticationTicket.UserData.Split('|');
    var principal = new GenericPrincipal(identity, roles);
    protocol.ConnectionContext.User = principal;
    **Thread.CurrentPrincipal = principal;**

2)在控制器的 OnAuthorization 覆盖中执行此操作:

    public override bool OnAuthorization(IAuthorizeAttribute authorizeAttribute)
    {
        Thread.CurrentPrincipal = ConnectionContext.User;
        return base.OnAuthorization(authorizeAttribute);
    }

第二种方法似乎适用于我的基本测试。实际上,当我这样做时,只需使用 [Authorize] 属性标记控制器类一次,然后我就可以在控制器方法上使用 PrincipalPermission 甚至我的一些自定义 CodeAccessSecurity 属性。

这样做安全吗?是否有一些异步行为会使其容易出错?有哪些替代方案?

4

1 回答 1

0

目前我描述的解决方案 2 似乎工作正常。由于没有人试图回复,我将接受它作为答案并继续测试。

于 2014-09-09T18:44:39.510 回答