首先,我知道这属于“不推荐的做法”类别,但我要求通过ASP.Net站点将Word文档转换为PDF,并且我一直在使用Word Interop作为它是免费的,易于实现,并且Word已经安装在服务器上。
当我进行测试时,它对我有用,但在发布用户后报告“未经授权的访问”错误。我有服务器的管理员权限,我发现在服务器上添加用户作为管理员工作,但我不想为每个用户授予管理员权限。
因此,有很多事情需要发生,是否有一个替代的免费库,用于将Word文档转换为PDF,我可以使用它?是否有一种简单的方法可以让我的用户访问Interop库而无需授予管理员权限?有没有办法模拟管理员用户的这部分Web应用程序,因为应用程序需要Windows身份验证?
还有什么我没有想到的可能对我有益吗?
答案 0 :(得分:2)
您可以使用模拟以不同的用户身份运行代码。 CodeProject上有一个很好的模拟类,http://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User。
只需在计算机上创建一个新的管理员帐户,可以访问您想要的内容,将凭据存储在应用程序设置中的web.config中(如果您想使用rijandael加密它们并使用代码解密它们等等< / p>
但是长期存储很短,你可以这样使用它,
using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
{
//This code is running elevated as the specified user
}
//This code is reverted back to the previous user.
我实际上编写了自己的web.config ConfigurationElement来存储凭据。它看起来像这样,
public class CredentialConfigurationElement : ConfigurationElement
{
#region Properties
[ConfigurationProperty("userName", DefaultValue="", IsRequired=true)]
public string UserName
{
get { return (string)this["userName"];}
set { this["userName"] = value; }
}
[ConfigurationProperty("password", DefaultValue = "", IsRequired = true)]
public string Password
{
get { return (string)this["password"]; }
set { this["password"] = value; }
}
#endregion
#region Explicit Operators
public static implicit operator NetworkCredential(CredentialConfigurationElement value)
{
return new NetworkCredential(value.UserName, value.Password);
}
public static implicit operator CredentialConfigurationElement(NetworkCredential value)
{
return new CredentialConfigurationElement() { UserName = value.UserName, Password = value.Password };
}
#endregion
}
但是,要使用它,您需要创建一个Custom ConfigurationSection,一个继承自ConfigurationSection的类,并将CredentialConfigurationElement公开为属性。
E.g。你可以创建一个名为CodeImpersonatorSection的新部分:ConfigurationSection
在那里将CredentialConfigurationElement公开为名为ImpersonationCredentials的属性。
然后使用(CodeImpersonatorSection)WebConfigurationManager.GetSection(&#34; / yoursectionnamehere&#34;);获取配置实例。
(可选)修改Impersonator类以自动执行此操作,并将其更改为具有静态方法(如
)Impersonator.RunUnderImpersonation(p => {
//This code is impersonating the configured user.
});