2011-05-10 58 views
1

我有一个简单的应用程序拆分为三个程序集。一种是允许用户从注册表读取密钥的客户表单。其次是用户登录的授权表单。第三个是一个.dll库,所有方法都在进行实际工作。使用多个程序集时请求主体权限失败

我遵循MSDN教程执行声明性安全检查在这里找到http://msdn.microsoft.com/en-us/library/dswfd229.aspx但仍然没有工作。

创建GenericPrincipal对象是这样的:

public static void CreatePrincipal(string user) 
    { 
     GenericIdentity MyIdentity = new GenericIdentity(user); 

     String[] MyString = { "Administrator", "User" }; 

     GenericPrincipal MyPrincipal = 
      new GenericPrincipal(MyIdentity, MyString); 

     Thread.CurrentPrincipal = MyPrincipal; 
    } 

这是位于该.dll装配CustomPrincipal类。

在同一组件我有以下方法用RegistryOperations类:

[PrincipalPermissionAttribute(SecurityAction.Demand, Name = "admin1", Role = "User")] 
    public static string ReadDeclarative() 
    { 
     ... 
    } 

没什么特别。在我的“授权”组装我有一个要求授权.dll文件方法GUI:

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     CustomPrincipal.CreatePrincipal(txtUsername.Text); 
    } 

终于在第三,“客户”组装我呼吁该.dll方法来读取注册表项:

private void btnReadRegistry_Click(object sender, EventArgs e) 
    { 
     txtContents.Text = RegistryOperations.ReadDeclarative(); 
    } 

这不起作用。我通过授权程序集登录,当我尝试阅读注册表时,我得到主体权限请求失败。 Visual Studio建议将程序集添加到一些神秘的完全信任列表中,但现在可以在VS2010中找到。请指教。

回答

0

当您登录时,您是否使用用户名admin1? (如果您不打算在权限验证中检查匹配的用户名,则应将其从需求中删除。)

+0

我确实打算检查用于测试目的的匹配用户名。我使用'admin1'用户名进行登录,所以不是这样:( – barjed 2011-05-10 13:25:55

+0

在这种情况下,我不能重新编写代码。是否尝试向btnReadRegistry_Click方法添加代码以验证Thread.CurrentPrincipal在执行时的内容? – 2011-05-10 16:33:59

+0

是的,我用调试器检查过它的内容。 – barjed 2011-05-10 21:19:36