小编psa*_*ton的帖子

使用Identity和Access工具为Thinktecture.IdentityServer配置WIF/WCF

注意:构建了一个github仓库以证明导致这些问题的问题.

在创建WIF安全WCF服务时,MSDN文档建议使用Visual Studio的身份和访问工具.在服务项目上运行该工具后,以下节点将添加到web.config [ commit 0472287 ]:

<ws2007FederationHttpBinding>
  <binding name="">
    <security mode="Message">
      <message>
        <issuerMetadata address="https://localhost/adfs/services/trust/mex" />
       </message>
     </security>
   </binding>
 </ws2007FederationHttpBinding>
Run Code Online (Sandbox Code Playgroud)

身份工具添加了不正确的issuerMetadata地址,根本不包括issure节点.值得庆幸的是,所有引用证书指纹的节点都是正确创建的.向此服务的客户端项目添加服务引用会导致客户端上的配置无效.在如下更改消息节点的内容后,创建对服务的服务引用会留下几乎可用的客户端(请参阅第二个问题)[ commit 758052d ].

      <message>
        <issuer address="https://localhost:44300/issue/wstrust/mixed/username" binding="ws2007HttpBinding" bindingConfiguration="" />
        <issuerMetadata address="https://localhost:44300/issue/wstrust/mex" />
      </message>
Run Code Online (Sandbox Code Playgroud)

第一个问题在设置导致绑定未正确配置的身份工具时,我做错了吗?生成的地址在STS FederationMetadata.xml文件中不存在,因此我不确定它的来源.

正确配置服务后,客户端的服务引用几乎即插即用.出于某种原因,它没有为WS2007FederationHttpBinding中的颁发者指定绑定配置.添加绑定并为WIF客户端创建绑定配置以获取令牌将导致客户端处于工作状态[ commit 39a4cbc ].

第二个问题更新服务web.config允许自动生成其余的客户端配置.我是否遗漏了客户端的内容以获得绑定自动配置?

所有这些缺少的元素都可以在IdentityMetadata.xml文件中查找,该文件是身份工具所需要的,以及两个项目都知道的FederationMetadata服务.似乎应该有一些东西可以使这些配置正确,而无需人工干预.

注意:构建了一个github仓库以证明导致这些问题的问题.

wcf wif thinktecture-ident-server

18
推荐指数
0
解决办法
378
查看次数

一段时间后,ASP.net WebApi2中的XML模型绑定失败

我在TopShelf容器中托管了几个webapi微服务,它们接受JSON和XML格式化程序并进行回复.运行一段时间后,XML格式化程序停止将XML请求数据绑定到模型.传递JSON或Form-Data仍然有效.指定Accept: application/xml导致XML响应的标头.重新启动服务后重播失败的XML请求将返回预期的响应.

问题的根本原因是,SupportedMediaTypes在服务运行且模型绑定失败时,XmlFormatter 的属性会在某个时刻被清除.

我怎样才能找到清除的东西SupportedMediaTypes


调查问题的注意事项如下.

我无法在任何可以连接调试器的环境中复制问题.

当我在本地调试时,其中一个服务开始失败.从我所看到的,它是选择DataContractSerializer而不是XmlSerializer进行反序列化.

Startup类按以下顺序添加格式化程序:

config.Formatters.Clear();
config.Formatters.Add(new RecordSetMediaTypeFormatter<RecordAssociation>());
config.Formatters.Add(new XmlMediaTypeFormatter { UseXmlSerializer = true });
config.Formatters.Add(new XmlMediaTypeFormatter { UseXmlSerializer = false });
config.Formatters.Add(new JsonMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)

检查HttpConfiguration中的格式化程序顺序表明XmlSerializer格式化程序具有优先级:

> actionContext.RequestContext.Configuration.Formatters
Count = 4
    [0]: {API.Formatters.RecordSetMediaTypeFormatter<API.Contract.DataObjects.RecordAssociation>}
    [1]: {System.Net.Http.Formatting.XmlMediaTypeFormatter}
    [2]: {System.Net.Http.Formatting.XmlMediaTypeFormatter}
    [3]: {System.Net.Http.Formatting.JsonMediaTypeFormatter}
> (actionContext.RequestContext.Configuration.Formatters[1] as System.Net.Http.Formatting.XmlMediaTypeFormatter).UseXmlSerializer
true
> (actionContext.RequestContext.Configuration.Formatters[2] as System.Net.Http.Formatting.XmlMediaTypeFormatter).UseXmlSerializer
false
Run Code Online (Sandbox Code Playgroud)

UseXmlSerializer == true格式表明,它可以读取的类型,但UseXmlSerializer == false格式是由集合选择,即使有System.Object:

> actionContext.RequestContext.Configuration.Formatters[1].CanReadType(typeof(System.Object))
true …
Run Code Online (Sandbox Code Playgroud)

xml asp.net asp.net-web-api asp.net-web-api2

10
推荐指数
0
解决办法
131
查看次数

Javascript new Date(dateString)处理

有人会解释为什么dateString不同的格式会给出不同的日期吗?

> new Date("04/08/1984")
<· Sun Apr 08 1984 00:00:00 GMT-0600 (Mountain Daylight Time)
> new Date("1984-04-08")
<· Sat Apr 07 1984 18:00:00 GMT-0600 (Mountain Daylight Time)
Run Code Online (Sandbox Code Playgroud)

javascript

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

mock方法调用回调函数sinon

你如何模拟使用sinon调用回调的外部方法?给出以下代码的示例,getText应该在回调函数中返回'a string'作为响应

sinon.stub(a, 'getText').returns('a string')
let cb = function(err, response) {
   console.log(response)
}
a.getText('abc', cb)
Run Code Online (Sandbox Code Playgroud)

它应该产生输出'一个字符串',因为它调用回调函数cb但没有输出

javascript sinon

7
推荐指数
2
解决办法
5954
查看次数

如何从自定义模型Binder返回HTTP状态代码

我有一个自定义模型绑定器,它从MEF容器中提取接口的实现.它实现如下:

public class PetViewModelBinder : DefaultModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var petId = bindingContext.ValueProvider.GetValue("id");
        var container = controllerContext.HttpContext.Application[MvcApplication.PLUGINS] as CompositionContainer;
        Lazy<IPet, IPetMetadata> pet = null;
        try
        {
            pet = container.GetExport(typeof(IPet), petId);
            var petVM = new Models.PetViewModel(pet);
            bindingContext.ModelMetadata.Model = petVM;

            return base.BindModel(controllerContext, bindingContext);
        }
        catch (Exception)
        {

            throw;
        }
        finally
        {
            container.ReleaseExport(pet);
        }

    }
Run Code Online (Sandbox Code Playgroud)

当MEF具有导出petId时,这非常有效...但是当导出不存在时返回http状态500(服务器错误).应返回错误消息混淆要求,指示http状态403(禁止).

可以采取哪些措施来捕获错误,更改响应状态,以及不返回内容,还是重新路由Action以处理此情况?

http-status-codes imodelbinder defaultmodelbinder asp.net-mvc-3

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