在XSockets.Net 4.0中使用PrincipalPermissions属性

时间:2014-09-07 18:39:46

标签: xsockets.net

在XSockets控制器内部,我需要调用Api(Assembly) PrincipalPermissions属性为其特定角色的方法,并且不知道它正在运行的主机(也可以在批处理,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属性。

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

1 个答案:

答案 0 :(得分:0)

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