Web Parts, Impersonate and Security Policy, Part 1

Web Parts, Impersonate and Security Policy

Part 1

 

Written by: Rickie Lee (rickieleemail at yahoo.com)

在开发某些Web Parts的时候,需要访问一些对象或数据。因为SPS进行严格的安全访问控制,有些用户授权实现这些操作,但是其他用户则没有授权,同时也不可能授予这些权限给所有人。

 

在这种情况下,当用户不具有权限去执行这些操作时,SPS将让IE弹出login窗口,让用户输入credentials凭据。为了避免这种不友好的间断,使用户平滑访问特权操作和资源,需要实现定制的impersonation方案。这样,执行这些操作的代码需要在合适的account帐户环境下,该帐户授权执行必要的操作。并且在这些操作执行完成后,用户的帐户需要返回至原来的domain帐户。

 

如下的示例代码(C#)用来显式创建System.Security.Principal.WindowsIdentity实例对象,标识新的account

protected static WindowsIdentity CreateIdentity(string User, string Domain, string Password)

{

          // The Windows NT user token.

          IntPtr tokenHandle = new IntPtr(0);

          const int LOGON32_PROVIDER_DEFAULT = 0;

          const int LOGON32_LOGON_NETWORK = 3;

 

          // Initialize token object

          tokenHandle = IntPtr.Zero;

          // Call LogonUser to obtain a handle to an access token.

          bool returnValue = LogonUser(User, Domain, Password,

                    LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT,

                    ref tokenHandle);

 

          // Check for failure

          if (false == returnValue)

          {

                    int ret = Marshal.GetLastWin32Error();

                    throw new Exception("LogonUser failed with error code: " + ret);

          }

 

          System.Diagnostics.Debug.WriteLine("Created user token: " + tokenHandle);

          //The WindowsIdentity class makes a new copy of the token.

          //It also handles calling CloseHandle for the copy.

          WindowsIdentity id = new WindowsIdentity(tokenHandle);

          CloseHandle(tokenHandle);

          return id;

}

 

[DllImport("advapi32.dll", SetLastError=true)]

private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,

          int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

 

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]

private extern static bool CloseHandle(IntPtr handle);

 

Web Parts调用示例代码:

// Assign new account information

string strUID = "Rickie";

string strPassword = "rickieleemail at yahoo.com";

string strDomain = "Your_Domain_Name";

 

// Change the context

WindowsIdentity objIdentity = CreateIdentity(strUID, strDomain, strPassword);

objContext = objIdentity.Impersonate();

// Perform actions that require higher permission level

......

// Tear down context

objContext.Undo();

 

首先调用CreateIdentity()方法,创建System.Security.Principal.WindowsIdentity实例对象,该account具有合适的访问权限。然后调用WindowsIdentity对象的Impersonate()方法,开始扮演(impersonate)新的windows identity,执行需要特权的方法或资源。完成上述操作后,停止impersonate并返回到用户原来的身份(account)。

 

***

未完,继续part2.

 

 

posted @ 2005-01-26 03:50  Rickie  阅读(1790)  评论(1编辑  收藏  举报