我需要一个用Excel VBA编写的函数,它将使用标准算法(如SHA-1)对密码进行哈希处理.一些简单的界面,如:
Public Function CreateHash(Value As String) As String
...
End Function
Run Code Online (Sandbox Code Playgroud)
该功能需要在安装了Excel 2003的XP工作站上运行,否则必须不使用第三方组件.它可以引用和使用XP提供的DLL,例如CryptoAPI.
有没有人知道实现这种散列功能的样本?
我有一个使用BasicHttpBinding和Windows身份验证的WCF服务.大多数客户端都是域帐户,并使用其默认凭据连接到服务.
现在,我想从在本地帐户下运行的ASP.NET客户端连接到该服务.我想使用ASP.NET应用程序可用的Windows凭据(域\用户和密码)连接到WCF服务.
我知道我可以使用ClientBase <T> .ClientCredentials在代码中执行此操作.
有没有办法在客户端的web.config文件中指定凭据(域\用户和密码),所以我不必更改代码?
编辑
如果无法在配置文件中完成,是否有办法使用System.Net.ICredentials或System.Net.NetworkCredential作为WCF服务的凭据?
.NET Framework提供了这些作为提供网络凭据的同类方式,但是对于WCF,这似乎已经被抛弃,而不是基于不相关的System.ServiceModel.Description.ClientCredentials类的新的不兼容系统.
编辑2
接受Marc对原始问题的回答 - 似乎在客户端配置文件中没有办法做到这一点:(
我认为这是WCF的一个缺陷 - 我不接受微软应该故意阻止我们在配置文件中放置凭据 - 毕竟它们必须存储在某个地方,而Framework包含加密配置文件的工具.我想我可以为此创建一个自定义的BehaviorExtensionElement,但它应该是开箱即用的.
它也有点不一致:system.net/mailSettings/smtp/network配置元素允许指定凭据,为什么不WCF?
关于使用System.Net.NetworkCredential的第二个问题,从这个博客看来,至少在使用Windows身份验证时,可以使用以下代码:
factory.Credentials.Windows.ClientCredential =
new System.Net.NetworkCredential(name, password, domain);
Run Code Online (Sandbox Code Playgroud) 从这个问题开始,我正在尝试实现一个不引人注意的确认对话框.
$(document).ready(function () {
$("[data-confirmPrompt]").click(function (event) {
var confirmPrompt = event.currentTarget.attributes['data-confirmPrompt'].value;
event.preventDefault();
$.prompt(confirmPrompt, {
buttons: { Yes: true, No: false },
callback: function (v, m, f) {
if (v) {
// User clicked Yes. Unbind handler to avoid
// recursion, then click the target element again
$(event.currentTarget).unbind('click');
event.currentTarget.click();
}
}
});
});
});
Run Code Online (Sandbox Code Playgroud)
当用户单击"是"时,我希望执行与事件关联的默认操作.我已经通过解绑jQuery处理程序并再次单击该元素完成了上述操作.这在提交表单或导航到不同页面时工作正常 - 但当然在支持AJAX的页面中不起作用,我想保留jQuery事件处理程序.
是否有其他通用方法来执行默认操作?逻辑上像event.executeDefault().
我最近遇到了CodeProject上的VerticalLabel控件.
我注意到OnPaint方法创建但不处理Pen和SolidBrush对象.
这是否重要,如果是这样,我怎样才能证明它可能导致的任何问题?
编辑
这不是关于IDisposable模式的一般问题.我知道调用者通常应该在任何实现IDisposable的类上调用Dispose.
我想知道的是,当GDI +对象没有按照上面的例子那样处理时,可以预期会出现什么问题(如果有的话).很明显,在链接的示例中,在垃圾收集器启动之前可能会多次调用OnPaint,因此可能会耗尽句柄.
但是我怀疑GDI +在某些情况下内部重用句柄(例如,如果你使用Pens类中特定颜色的笔,它会被缓存并重用).
我想要了解的是,链接示例中的代码是否能够在忽略调用Dispose的情况下逃脱.
如果没有,看一个样本,证明它可能导致什么问题.
我应该补充一点,我经常(包括MSDN上的OnPaint文档)看到WinForms代码示例未能处理GDI +对象.
对于仅表示日期的OperationContract的参数(无时间组件或时区指示符),需要使用xs:Date,以避免客户端和服务器之间的时区转换的任何歧义或问题.
WCF当前仅支持用于序列化DateTime参数的xs:DateTime.
使用将被序列化为xs:Date的参数生成OperationContract的最简单方法是什么?
我正在考虑使用自定义.NET类型"public struct DateOnly"或类似的方法,使用隐式转换为标准DateTime,从而以某种方式自动生成wsdl作为xs:Date.
这是可能的,我将如何实施它?
如果有可能,我怀疑解决方案可能涉及在自定义类型上使用XmlSchemaProviderAttribute,但是我在此属性上找到的任何文档似乎都有些不透明.
更新
我发现很难相信它会增加获得解决方案的可能性,但我会遵循网站的建议并开始赏金.
为了清楚起见,赏金的条件是提供构建解决方案所需的所有信息,以便WCF OperationContract的参数可以是:
序列化为ws:Date并在生成的WSDL中描述.
可以是System.DateTime值,也可以隐式转换为DateTime.
我正在寻找有关在我的ASP.NET应用程序中动态重新配置Log4Net日志记录级别的最佳方法的提示.我通常使用简单配置,其中根记录器定义默认日志记录级别,例如
<log4net>
<root>
<level value="INFO" />
<appender-ref ref="..." />
<appender-ref ref="..." />
... etc ...
</root>
... etc
Run Code Online (Sandbox Code Playgroud)
并且可能有几个appender,每个appender都有过滤器来定义他们使用的日志记录级别.
我希望能够做的第一件事是允许管理员连接到一个管理页面,使他们能够(a)查看根记录器的当前级别,以及(b)动态更改它.我不想使用"ConfigureAndWatch"并写入磁盘上的配置文件,因为我不希望在应用程序被回收时这些更改仍然存在.
接下来我想更进一步,在Admin页面上能够显示一个TreeView,其中包含应用程序中存在的所有当前Logger及其当前日志记录级别.并允许管理员能够在层次结构的任何级别有选择地更改日志记录级别.
我的想法是创建一个通用管理页面,我可以将其放入我的所有应用程序中,使管理员能够动态选择性地启用DEBUG级别的日志记录以进行故障排除.
我发现Log4Net API有点令人困惑,任何人都可以指向样本或显示实现此目的的最佳方法.
更新:
两个答案都同样好,所以我接受了第一个 - 谢谢.为了重新开始,我可以获得所有当前的记录器,如下所示:
foreach (log4net.ILog log in log4net.LogManager.GetCurrentLoggers())
{
log4net.Repository.Hierarchy.Logger logger =
(log4net.Repository.Hierarchy.Logger)log.Logger;
Debug.WriteLine(
String.Format("{0} Parent {1} Level {2} EffectiveLevel {3}<br>",
logger.Name,
logger.Parent.Name,
logger.Level == null ? "<null>" : logger.Level.Name,
logger.EffectiveLevel
)
);
}
Run Code Online (Sandbox Code Playgroud)
EffectiveLevel是有效级别 - 如果后者不为null,则与Level相同,否则从父级继承.
上面返回的至少一个记录器将根记录器作为父记录器,这使我能够获得对根记录器的引用.
通过上述内容,应该可以重建记录器层次结构.
更新2
再次感谢.我已经实现了一个ASP.NET服务器控件,它在带有复选框的TreeView中显示记录器层次结构,并允许用户动态更改层次结构中任何节点的日志记录级别.效果很好,我将把它放在所有ASP.NET Web和Web服务应用程序的管理页面上!
我以非管理员身份创建了一个RSA机器商店容器,并为自己分配了完全控制权,以及对其他帐户的读取权限.
我希望能够以编程方式查看密钥容器的ACL.当我尝试使用下面的代码执行此操作时,即使我是密钥容器的所有者并具有完全控制权,我也会收到以下异常:
System.Security.AccessControl.PrivilegeNotHeldException: The process does not possess the 'SeSecurityPrivilege' privilege which is required for this operation.
at System.Security.AccessControl.Privilege.ToggleState(Boolean enable)
at System.Security.Cryptography.Utils.GetKeySetSecurityInfo(SafeProvHandle hProv, AccessControlSections accessControlSections)
at System.Security.Cryptography.CspKeyContainerInfo.get_CryptoKeySecurity()
...
Run Code Online (Sandbox Code Playgroud)
我可以使用Windows资源管理器或CACLS查看权限,以查看密钥文件C:\Documents and Settings\All Users\...\Crypto\RSA\MachineKeys,因此我的帐户似乎具有所需的权限.
我正在使用的代码如下:
CspParameters cp = new CspParameters();
cp.Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore;
cp.KeyContainerName = containerName;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp))
{
// PrivilegeNotHeldException thrown at next line while
// dereferencing CspKeyContainerInfo.CryptoKeySecurity
if (rsa.CspKeyContainerInfo.CryptoKeySecurity != null)
{
foreach (CryptoKeyAccessRule rule in rsa.CspKeyContainerInfo.CryptoKeySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
{ …Run Code Online (Sandbox Code Playgroud) 在MSDN文档中找不到任何关于此的内容.
也就是这样做,说:
using(PrincipalSearcher searcher = ...)
{
foreach (var principal in searcher.FindAll())
{
... do something ...
} // The PrincipalSearchResult<T> returned by searcher.FindAll is disposed here
}
Run Code Online (Sandbox Code Playgroud)
这是我见过的大多数例子,或者我应该这样做:
using(PrincipalSearcher searcher = ...)
{
foreach(var principal in searcher.FindAll())
{
using (principal)
{
// ... do something ...
}
}
}
Run Code Online (Sandbox Code Playgroud)
后者(在迭代期间明确地处理每个项目)看起来"更安全" - 即符合指南以明确处理所有IDisposable对象 - 但它有点凌乱; 例如,它排除了使用LINQ迭代搜索结果.
回应@Rup的评论:
你可以编写一个从父迭代器返回一个结果的yield迭代器
是的,我认为这样可以启用LINQ.像下面的扩展方法:
public static IEnumerable<T> EnumerateAndDispose<T>(this IEnumerable<T> collection) where T : IDisposable
{
foreach (T item in collection)
{
using (item)
{
yield …Run Code Online (Sandbox Code Playgroud) 我有一个在IIS中托管的网站,它使用Windows身份验证并公开WCF Web服务.
我使用端点行为配置此服务:
<serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName="MyRoleProvider"/>
Run Code Online (Sandbox Code Playgroud)
和绑定:
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
Run Code Online (Sandbox Code Playgroud)
调用服务时,Thread.CurrentPrincipal将设置为a,RolePrincipal其中包含客户端的Windows标识和由配置的提供程序提供的角色.
一切都与世隔绝.
现在我添加了REST-ful Ajax调用所使用的一些其他WCF服务:Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"在svc文件中,WebGet服务契约中的AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)属性以及服务实现上的属性.
我还按照MSDN中的建议将以下咒语添加到web.config:
<system.serviceModel>
...
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
...
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
我的Ajax服务几乎按照我想要的方式工作.当它被调用时,HttpContext.Current.User被设置为RolePrincipal具有我期望的角色的a .但Thread.CurrentPrincipal仍然未经认证GenericPrincipal.
所以我需要为每个服务方法添加一行代码:
Thread.CurrentPrincipal = HttpContext.Current.User
Run Code Online (Sandbox Code Playgroud)
我可以使用配置文件中的任何咒语Thread.CurrentPrincipal来自动设置,就像普通的SOAP服务一样吗?
更新 这是来自有同样问题的人的博客,并通过实现自定义行为解决了这个问题.当然有一种方法可以开箱即用吗?
更新2 回来为此添加一个赏金,因为它在一个新项目中再次困扰我,在.NET 3.5上使用支持WCF WebGet的服务.
我已经尝试了很多选项,包括设置principalPermissionMode ="None",但没有任何效果.这是发生的事情:
我导航到调用我的服务的WebGet URL: http://myserver/MyService.svc/...
我在Global.asax"Application_AuthorizeRequest"中放了一个断点.当命中此断点时,"HttpContext.Current.User"和"Thread.CurrentPrincipal"都已设置为使用我配置的ASP.NET RoleProvider的"RolePrincipal".这是我想要的行为.
调用我的服务的OperationContract方法时,我有第二个断点.当遇到此断点时,HttpContext.Current.User仍然引用我的RolePrincipal,但Thread.CurrentPrincipal已更改为GenericPrincipal.Aaargh.
我已经看到了实现自定义IAuthorizationPolicy的建议,如果我找不到更好的解决方案,我会调查一下,但为什么我需要实现自定义策略来利用现有的ASP.NET授权功能呢?如果我有principalPermissionMode ="UseAspNetRoles",肯定WCF应该知道我想要什么?
我有一个Windows批处理文件,其目的是设置一些环境变量,例如
=== MyFile.cmd ===
SET MyEnvVariable=MyValue
Run Code Online (Sandbox Code Playgroud)
用户可以在完成需要环境变量的工作之前运行它,例如:
C:\> MyFile.cmd
C:\> echo "%MyEnvVariable%" <-- outputs "MyValue"
C:\> ... do work that needs the environment variable
Run Code Online (Sandbox Code Playgroud)
这大致相当于Visual Studio安装的"Developer命令提示符"快捷方式,它设置了运行VS实用程序所需的环境变量.
但是,如果用户碰巧打开了Powershell提示符,则环境变量当然不会传播回Powershell:
PS C:\> MyFile.cmd
PS C:\> Write-Output "${env:MyEnvVariable}" # Outputs an empty string
Run Code Online (Sandbox Code Playgroud)
对于在CMD和PowerShell之间切换的用户而言,这可能会造成混淆.
有没有办法可以在我的批处理文件MyFile.cmd中检测到它是从PowerShell调用的,所以我可以,例如,向用户显示警告?这需要在没有任何第三方实用程序的情况下完成.
.net ×6
wcf ×3
ajax ×1
asp.net ×1
batch-file ×1
cmd ×1
credentials ×1
encryption ×1
events ×1
excel ×1
hash ×1
idisposable ×1
jquery ×1
log4net ×1
powershell ×1
rsa ×1
sha1 ×1
vba ×1
windows ×1
winforms ×1
xml ×1