小编mdi*_*bio的帖子

RequestSecurityToken使用Windows凭据和.ne​​t 4.5 WIF

任何人都可以指向使用NT凭据主动发出RequestSecurityToken的示例代码 Thread.CurrentPrincipal as ClaimsPrincipal吗?

该场景是一个启用了Windows身份验证的asp.net Web应用程序(因此有一个经过身份验证的WindowsIdentity).我的愿望是主动调用STS而不是启用passiveRedirect,并使用.Net 4.5身份库执行此操作.

大多数代码示例(例如,用于Windows Phone的Claims Helper使用Active STS)使用username/pwd输入和UserNameWSTrustBinding设置凭据.

我认为解决方案可能涉及模拟或使用channelFactory.CreateChannelWithActAsToken()从Windows标识创建的令牌调用.

- 当访问/ adfs/services/trust/13/windowsmixed端点时,以下.Net4.5代码确实获得了GenericXmlSecurityToken.但是,声明适用于运行站点的域帐户,而不是经过身份验证的用户的域帐户.当我将端点切换到/ adfs/services/trust/13/kerberossmixed时,我得到了"无法协商"的错误,如几个问题和论坛中所述,但我不能在.Net 4.5中应用任何提供的解决方案.其中一个未从Microsoft.IdentityModel移植过的类是KerberosWSTrustBinding ...

public static void CallSts()
{
    try
    {
        var wsMod = FederatedAuthentication.WSFederationAuthenticationModule;
        var appliesToEp = new EndpointReference(wsMod.Realm);
        var stsEp = new EndpointAddress(new Uri(wsMod.Issuer), EndpointIdentity.CreateSpnIdentity("stsSpn"));

        var msgBinding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential, false);
        msgBinding.Security.Message.EstablishSecurityContext = false;
        msgBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;

        using(var factory = new WSTrustChannelFactory(msgBinding, stsEp))
        {
            factory.Credentials.SupportInteractive = false;
            factory.TrustVersion = TrustVersion.WSTrust13;

            var myRst = new RequestSecurityToken
            {
                RequestType …
Run Code Online (Sandbox Code Playgroud)

asp.net security wif .net-4.5

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

在Web Api 2中从OData客户端调用补丁的正确方法是什么

在web api团队创建的OData示例之后,我的控制器具有以下支持补丁:

public HttpResponseMessage Patch([FromODataUri] int key, Delta<Foo> item)
{
  var dbVersion = myDb.GetById(key);
  if(dbVersion == null)
    throw Request.EntityNotFound();

  item.Patch(dbVersion);
  myDb.Update(dbVersion);

  return Request.CreateResponse(HttpStatusCode.NoContent);
}
Run Code Online (Sandbox Code Playgroud)

并使用自动生成的客户端(派生自DataServiceContext),我提交了这样的补丁请求:

var foo = svcContainer.Foos.Where (f => f.Id == 1).SingleOrDefault();
foo.Description = "Updated Description";
svcContainer.UpdateObject(foo);
svcContainer.SaveChanges(SaveChangesOptions.PatchOnUpdate);
Run Code Online (Sandbox Code Playgroud)

但是,在fiddler中跟踪调用,我看到Foo的所有其他属性都被序列化并发送到服务.这是正确的行为吗?我希望只通过网络发送ID和描述.另外,如果我调试服务方法并调用

GetChangedPropertyNames 在item上,返回其所有属性名称.

我应该在客户端上创建某种Delta实例吗?

我理解服务的断开性质,因此服务端没有用于跟踪更改的上下文,但在我看来,api团队为某个原因添加了对补丁的支持,所以我想知道客户端是否应该以不同的方式调用更新.

更新

YiDing提供的链接解释了如何从客户端创建一个真正的PATCH请求(使用Microsoft.OData.Client.DataServiceContextMicrosoft.OData.Client 6.2.0上面和上面创建的.为方便起见,这里是代码片段:

var svcContainer = new Default.Container(<svcUri>);
var changeTracker = new DataServiceCollection<Foo>(svcContainer.Foos.Where(f => f.Id == 1));
changeTracker[0].Description = "Patched Description";
svcContainer.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

DataServiceCollection工具财物跟踪,并使用这种模式,只有更新的属性发送到服务.不使用DataServiceCollection和简单使用

svcContainer.UpdateObject(foo); …
Run Code Online (Sandbox Code Playgroud)

odata asp.net-web-api

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

如何为LINQPad重新加载插件/ AppDomain

我观察到,如果我刷新或重新加载LINQPad指定的插件目录中的dll,我必须关闭并重新打开当前脚本以使库更改生效 - 这当然是有道理的.我的问题是,如果有一个命令或密钥专门执行此重新加载而不关闭脚本窗口?

linqpad

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

是否可以使用&符号的REST url参数?

使用System.ServiceModel库进行路由,我有一个REST服务,其中包含一个简单的模板

"{} SEARCHTERM?选择= {} someSearchOpt

所以电话会是这样的:

http://myhost.contoso.com/searchapi/river%20expeditions

搜索短语"河流探险队"没有选项.

这只是接受搜索短语并返回结果.它工作得很好.但是,如果搜索包含文字&符号的短语,例如"Lewis&Clark",我尝试了明显的url编码&符号

刘易斯%26Clark

但即便如此,请求永远不会被路由,但服务器会立即返回400 Bad Request.很明显,它被解释为查询字符串分隔符,并使请求无效,因为此特定模板需要一个url参数并且没有前面的"?" 分隔符.

由于这些搜索短语可能具有其他受限制的字符,因此预期它们由客户端编码的url,并且当它们被成功路由时,REST api调用参数上的HttpUtility.UrlDecode.所以我的问题是,如果有一些技术可以将url编码的&符号正确路由为rest url参数而不是作为查询字符串分隔符进行预先解释和拒绝?

更新:对于记录,如果搜索词期望作为查询字符串参数(不是url参数),则发送Lewis%26Clark可以正常工作.例如

http://myhost.contoso.com/searchapi?searchTerm=lewis%26clark

因此,为了澄清,我希望在REST模板中使用url参数时获得相同的结果.

.net c# rest

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

使用SQL Server进行实时聚合和非规范化的体系结构建议

我们有一个企业LOB应用程序,用于使用SQLServer(2008)管理数百万个书目(大量文本)记录.数据库非常规范化(完整记录可能很容易由十个连接表加上嵌套集合组成).写交易很好,我们现在有一个非常敏感的搜索解决方案,它慷慨地使用全文索引和索引视图.

问题是,在现实中,许多内容研究用户需要,可以更好地提供服务的只读仓储式拷贝数据,但它需要近乎实时地连续复制(几分钟的等待时间是精细).

我们的搜索已经通过几个计算列或复合表进行了优化,我们希望添加更多.索引视图由于其约束(例如没有外部联接)而无法满足所有需求.这些数据有许多"方面",就像只读数据仓库可能提供的那样,涉及权限,地理位置,类别,质量和相关文档的数量.我们还组成了相当静态的记录的复杂xml表示,可以组合和存储一次.

如果完全通过触发器完成,则非规范化,计算和搜索优化的总量会引起不可接受的延迟,并且还容易发生锁定冲突.

我已经研究了一些Microsoft的SQL Server建议,我想知道是否有任何具有类似要求经验的人可以提供以下三个建议(或其他使用SQL Server/.Net堆栈的建议):

  1. 事务性复制到只读副本 - 但是从文档中不清楚可以在订户端更改模式并添加触发器,计算列或组合表;

  2. 表分区 -不改变数据,但也许是为了数据的段大面积,目前正在不断重新计算,例如权限,记录类型(60),地理区域等...将允许在事务侧触发运行少锁?

  3. 离线批处理 - 微软经常使用该短语,但除了在交易复制的订户端"检查信用卡欺诈迹象"之外,没有提供很好的例子......这将是一个很好的样本,但是如何完成究竟在实践中?每5分钟运行一次的SSIS工作?服务经纪人?连续轮询的外部可执行文件?我们要避免"跑,晚上一个漫长的过程"解决方案,我们也想避免被交易服务器上运行的更新密集聚集/合成日常每5分钟的事情事务副锁定了.

    • 更新到#3:发布后,我发现这个SO答案带有使用变更跟踪,服务代理,SSIS和触发器的实时数据集成的链接- 看起来很有希望 - 这是推荐的路径吗?

    • 另一个更新:反过来,它帮助我找到rusanu.com - 所有东西ServiceBroker由SO用户Remus Rusanu.异步消息传递解决方案似乎比复制方案更好地匹配我们的场景......

sql-server full-text-search data-warehouse service-broker transactional-replication

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

HashSet&lt;T&gt;.CreateSetComparer 的用法示例

我知道该HashSet<T>.SetEquals方法,但是何时以及如何CreateSetComparer使用?

文档指出:“仅在一个级别检查相等性;但是,您可以将其他级别的比较器链接在一起以执行更深入的相等性测试”

一个简单的例子是什么?

特别是,如果我要比较的集合中的每个项目也包含 HashSet ,那么 的正确用法是什么CreateSetComparer

这是我的出发点。我想知道该CreateSetComparer方法是否适用以及如何正确使用它:

public class Foo : IEquatable<Foo>
{
    public string Label { get; set; }
    public string Value { get; set; }
    public override string ToString() {return String.Format("{0}:{1}", Label, Value); }

    // assume for this example that Label and Value are immutable once set;
    public override int GetHashCode(){ return ToString().GetHashCode(); }
    // simplified equality check; assume it meets my needs for this example; …
Run Code Online (Sandbox Code Playgroud)

.net c# hashset

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

用于 redis-stack-server 持久化的 Docker-Compose 命令

如果我使用使用 docker compose 配置的默认redis docker 映像,如下所示:

redis-storage:
  image: redis:7.0
  container_name: 'redis-storage'
  command: ["redis-server", "--save", "1200", "32", "--loglevel", "warning"]
  volumes:
    - redis-storage-data:/data
Run Code Online (Sandbox Code Playgroud)

如果至少有 32 个更改,它会正常启动并每 20 分钟写入一次磁盘。

但是,如果我使用相同的command方法,image: redis/redis-stack-server:latest它似乎可以正常启动,但它实际上会进入保护模式并且变得无法访问。注释掉命令,一切正常。

command允许更改默认保存到磁盘参数的 docker-compose 格式正确的是什么?

(还尝试了替代语法command: redis-server --save 1200 32:)

redis docker-compose redis-stack-server

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