Azure辅助角色模拟域帐户

时间:2013-09-19 17:02:19

标签: azure active-directory azure-worker-roles azure-active-directory

我的情况是我有一个Azure辅助角色,需要连接到本地文件共享。本地通过VPN连接到Azure实例。使用Active Directory联合身份验证服务将本地AD与Azure AD同步。辅助角色是将特定文件从本地帐户复制到Azure帐户中的Blob存储。

工作者角色是否可以冒充域帐户?如果是这样,怎么样?或者我如何实现我的目标?

谢谢!

1 个答案:

答案 0 :(得分:3)

我们这样做,使用下面的课程

通过传入我们拥有的令牌,您可以轻松调用Impersonate和UndoImpersonation。请注意,将凭据安全地存储在云环境中非常重要。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Principal;
using System.Text;

namespace Codit.Common.Security
{
    public static class Impersonation
    {
        [DllImport("advapi32.DLL", SetLastError = true)]
        public static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

        [DllImport("advapi32.DLL")]
        public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);  //handle to token for logged-on user 

        [DllImport("advapi32.DLL")]
        public static extern bool RevertToSelf();

        public static object Impersonate(string user, string password)
        {
            string domain = "";
            if (user.IndexOf(@"\") > 0)
            {
                domain = user.Substring(0, user.IndexOf(@"\"));
                user = user.Substring(user.IndexOf(@"\") + 1);
            }

            IntPtr securityToken;

            LogonUser(user, domain, password, 9, 0, out securityToken);
            if (securityToken != IntPtr.Zero)
            {
                var newIdentity = new WindowsIdentity(securityToken);
                WindowsImpersonationContext impersonationContext = newIdentity.Impersonate();

                return impersonationContext;
            }

            throw new InvalidOperationException("The username or password combination was invalid, please verify your settings");
        }

        public static void UndoImpersonation(object impersonationContext)
        {
            var context = impersonationContext as WindowsImpersonationContext;
            if (context != null) context.Undo();
        }
    }
}

您可以做的另一件事是创建本地侦听器(在本地服务器上,在所需帐户下运行)此侦听器可以轮询文件并将它们推送到blob存储区。