小编Kei*_*ith的帖子

使用WSSecurityTokenSerializer读取在.Net中验证SAML断言的问题

我有一个SAML断言,我希望在.Net中使用WSSecurityTokenSerializer.

尽管存在一些问题,我还是拥有了密钥链和SAML XML .

首先,我从HTTPS POST获得SAML断言:

// spec says "SAMLResponse=" 
string rawSamlData = Request["SAMLResponse"];

// read the base64 encoded bytes
byte[] samlData = Convert.FromBase64String(rawSamlData);

// read back into a UTF string
string samlAssertion = Encoding.UTF8.GetString(samlData);

// get the SAML data in an XML reader
var assertionPostStream = new StringReader(samlAssertion);
var reader = XmlReader.Create(assertionPostStream);
Run Code Online (Sandbox Code Playgroud)

然后我得到了我的IdP提供的密钥:

// get the key data
byte[] certificateData = System.IO.File.ReadAllBytes("myKeys.p7b");

// decode the keys
var cms = new SignedCms(SubjectIdentifierType.IssuerAndSerialNumber);
cms.Decode(certificateData);

// we have …
Run Code Online (Sandbox Code Playgroud)

.net x509certificate single-sign-on saml-2.0 pkcs#7

3
推荐指数
1
解决办法
6403
查看次数

隔离AppDomain中抛出的异常以免崩溃应用程序

TL; DR:如何通过杀死主进程来隔离加载项异常?

我希望有一个非常稳定的.Net应用程序,它运行的代码不太稳定AppDomain.这似乎是最初的主要目的之一AppDomain(嗯,那和安全沙箱),但它似乎不起作用.

例如AddIn.exe:

public static class Program
{
    public static void Main(string[] args)
    {
        throw new Exception("test")
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的"稳定"代码中调用:

var domain = AppDomain.CreateDomain("sandbox");
domain.UnhandledException += (sender, e) => { 
    Console.WriteLine("\r\n ## Unhandled: " + ((Exception) e.ExceptionObject).Message);
};
domain.ExecuteAssemblyByName("AddIn.exe", "arg A", "arg B")
Run Code Online (Sandbox Code Playgroud)

将抛出的异常AppDomain直接传递给创建域的应用程序.我可以记录这些domain.UnhandledException并在包装器应用程序中捕获它们.

但是,抛出更多有问题的异常,例如:

public static class Program
{
    public static void Main(string[] args)
    {
        Stackoverflow(1);
    }

    static int Stackoverflow(int x)
    {
        return Stackoverflow(++x);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将抛出stackoverflow异常,每次都会终止整个应用程序.它甚至没有开火domain.UnhandledException …

.net c# appdomain

3
推荐指数
2
解决办法
2627
查看次数

使用 @ts-check 在 JS 文件中输入一个元素

我有一个带有// @ts-check指令的 JS 文件,使用 JSDoc 注释来表示类型。

问题是元素在从document.

所以我们在 HTML 中有:

<input id="myInput">...
Run Code Online (Sandbox Code Playgroud)

当我在 JS 中获取此元素时,类型检查会引发错误:

// @ts-check
const myInput = document.getElementById('myInput');
myInput.value = 'foobar';
Run Code Online (Sandbox Code Playgroud)

“HTMLElement”类型上不存在属性“value”

如果我使用 JSDoc@type注释指定预期类型,那么也会引发错误:

// @ts-check

/** @type {HTMLInputElement} */
const myInput = document.getElementById('myInput');
myInput.value = 'foobar';
Run Code Online (Sandbox Code Playgroud)

类型“HTMLElement”不可分配给类型“HTMLInputElement”。
“HTMLElement”类型中缺少属性“accept”。

如果我在 TS 中,我可以document.getElementById('myInput') as HTMLInputElement用来告诉它我期望这种类型。

我如何在 JS 中做到这一点@ts-check

javascript jsdoc typescript ts-check

3
推荐指数
1
解决办法
682
查看次数

升级到Razor 2/RE 3.2后,RazorEngine扩展方法因RuntimeBinderException而失败

我有一个RazorEngine项目,在升级到Razor 2.0和RazorEngine 3.2.0之后失败了

这在之前基于Razor 1.0的RazorEngine版本(3.0.8)中运行良好.

我有myInstance一个class(MyClass)的实例()和扩展方法:

namespace MyCompany.Extensions 
{
    public static class MyClassExtensions
    {
        public static string ExtensionMethod(this MyClass thing) 
        {
            // do stuff
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在RazorEngine视图中调用它(简化示例,有很多这些方法,并且都以相同的方式失败):

@using MyCompany.Extensions
@using MyCompany
@{
    var myInstance = new MyClass(Model, ...);
}

Some text @myInstance.ExtensionMethod() some more text
Run Code Online (Sandbox Code Playgroud)

这是由RazorEngine编译的文本文件:

string parsedResult = RE::Razor.Parse(fileContent, myModel, "testfile.txt");
Run Code Online (Sandbox Code Playgroud)

问题是这条线(曾经工作过)抛出RuntimeBinderException:

'MyCompany.MyClass'不包含'ExtensionMethod'的定义

请注意,如果我将文本文件更改为:

Some text @MyClassExtensions.ExtensionMethod(myInstance) some more text
Run Code Online (Sandbox Code Playgroud)

它工作正常,所以我认为它必须找到扩展方法的命名空间.

我的第一个想法是它必须将传递的模型视为一个dynamic(因此也是从它衍生出来的任何东西dynamic),但它知道了预期的类型RuntimeBinderException.由于异常是运行时我认为在编译模板时必须无法识别扩展方法,但为什么会发生变化?

我不确定3.0.8和3.2.0之间有什么变化,或者为什么会这样.我需要添加一些东西,以便在编译模板时找到扩展方法吗?

extension-methods razor razor-2

2
推荐指数
1
解决办法
1132
查看次数

Marshal.DestroyStructure与.Net中的Marshal.FreeHGlobal

我有一个托管的.Net类,它创建了我需要确保正确清理的非托管资源.

我有一个顺序结构:

[StructLayout(LayoutKind.Sequential)]
struct FooBar { ... }
Run Code Online (Sandbox Code Playgroud)

然后在构造函数中我有:

// Allocate the memory
var fb = new FooBar(...);
int length = Marshal.SizeOf(typeof(FooBar));
this.pointer = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(fb, this.pointer, false);

// Then I use this.pointer in extern calls
Run Code Online (Sandbox Code Playgroud)

然后在我的~Finaliser/ Dispose方法中,我使用Marshal.DestroyStructure或者Marshal.FreeHGlobal两者(如果是这样,以什么顺序)忍受我不泄漏内存?

奖金问题:

  • 我的IDisposable类是否需要继承CriticalFinalizerObject以确保始终调用清理?
  • 有没有Microsoft.Win32.SafeHandles我可以用来包装危险的非托管内存的类?

.net dispose unmanaged finalizer marshalling

2
推荐指数
1
解决办法
883
查看次数

使用Microsoft.Win32.SafeHandles与Marshal.AllocHGlobal和Marshal.FreeHGlobal

我有一个.Net类,为struct使用分配非托管内存Marshal.AllocHGlobal,然后使用它来处理它Marshal.FreeHGlobal.

我理解这些类Microsoft.Win32.SafeHandles提供了处理这个的包装器,但是不清楚如何实例化它们(很多都没有构造函数) - 我应该编写抽象基类的特定实现还是有一些方法来使用它们在extern声明中?

.net winapi marshalling

2
推荐指数
1
解决办法
504
查看次数

如何从 ASP.NET Core 的静态文件中排除文件夹?

我有一个文件夹"wwwroot",在返回静态文件时不想包含在该文件夹下。

我想返回"wwwroot"(例如"wwwroot/images")下的各种目录,这个中间件步骤可以实现:

app.UseStaticFiles(); 
Run Code Online (Sandbox Code Playgroud)

我可以通过它StaticFileOptions来配置返回的内容。

我想排除一个目录(例如"wwwroot/node_modules")并且不允许从中提供任何 statif 文件。

似乎没有我可以使用的过滤器StaticFileOptions- 我应该如何应用该过滤器?

static-files asp.net-core asp.net-core-middleware

2
推荐指数
1
解决办法
1996
查看次数

使用 CancellationToke 添加作用域依赖项

我有一个 .NET 核心依赖项,其范围仅限于每个 REST API 请求。它是Startup.ConfigureServices通过调用添加的AddScoped

我想为此添加取消支持。如果我将 a 添加CancellationToken cancellationToken到任何控制器操作的参数中,我可以获得一个在客户端请求被取消时被取消的令牌。然后我可以将该令牌传递给我的依赖项上的所有方法。

但是,依赖关系的范围仅限于请求,因此通过操作将令牌传递给方法感觉没有必要 - 我可以以CancellationToken某种方式将其添加到范围依赖关系中吗?

c# dependency-injection request-cancelling .net-core asp.net-core

2
推荐指数
1
解决办法
2154
查看次数

如何避免使用 ASP.NET Core 依赖项注入的大量 [FromService] 参数?

我有一个使用大量依赖注入的 ASP.NET Core 项目。

问题是这些开始堆积在我的控制器动作上:

public async Task LoginAsync(
    [FromBody] LoginModel login,
    [FromServices] IConnectionMultiplexer redis,
    [FromServices] ISerialiserFactory serialiser,
    [FromServices] IDataService dataService,
    [FromServices] ILookupNormalizer normaliser,
    [FromServices] IPasswordHasher hasher,
    ...
Run Code Online (Sandbox Code Playgroud)

我可以将它们放在构造函数中,但大多数方法不使用它们,而那些使用它们的方法并不总是使用所有这些。

我可以直接实例化它们,但是我失去了在启动时注入它们的能力。

有没有更简单的方法来获得这些注入的服务?理想情况下,我想调用类似的东西:

// It turns out I need the injected serialiser
var serialiser = services.Get<ISerialiserFactory>();
Run Code Online (Sandbox Code Playgroud)

有没有办法在 ASP.NET Core 中做到这一点?

c# dependency-injection asp.net-core

1
推荐指数
1
解决办法
2060
查看次数

在 .NET Core 中使用 ILogger 如何记录 unicode 字符

我有一个依赖注入ILoggerFactory,它ILogger在 .NET Core 2.1 应用程序中生成 。

\n\n

我想记录这样的内容:

\n\n
logger.LogInformation("Magic Char {MagicChar}", "\xce\xbb")\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是实际记录的是:

\n\n
info <myClass>\n     Magic Char ?`\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何使用 .NET 的内置记录器记录 unicode 字符?

\n

logging .net-core

1
推荐指数
1
解决办法
2075
查看次数

为什么打字稿属性装饰器在升级后停止工作?

我有一个简单的 TypeScript tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "experimentalDecorators": true,
    ...
Run Code Online (Sandbox Code Playgroud)

以及一个使用装饰器的类:

class MyClass {
    @myDecorator()
    myField: any;
}
Run Code Online (Sandbox Code Playgroud)

装饰器导致myField作为使用函数的属性发出__decorate,该myDecorator函数被传递给它。

升级到最新版本 (4.2.4) 后,它在 Visual Studio 2019 中停止工作,但它继续在 VS Code(使用 4.3.5)和持续集成工具(在 4.3.5 和较旧的 3.* TypeScript 版本中)中工作)。

经过一番调查后发现,发出的 JavaScript 已更改为显式包含这些字段,但仅限于 Visual Studio 2019 中嵌入的 TypeScript 4.2.4。这些显式字段导致__decorate无法创建同名的新属性。

为什么发出的 JS 发生了变化?

我如何解决它?

javascript visual-studio typescript tsconfig typescript-decorator

1
推荐指数
1
解决办法
2944
查看次数