小编pet*_*ski的帖子

使用jQuery/Ajax从JavaScript调用WCF/JSON/REST WebService

我知道有很多关于此的问题 - 相信我,我已经阅读了很多这些问题并尝试了解答.

(此项目适用于内部公司局域网,而非互联网)

我们有一个WCF Web服务,它是RESTFUL并发送/接收JSON,它需要NTLM(Curb也会很好)auth /凭证以确保主叫用户(来自浏览器是他们所说的人),这是在浏览器/客户端和WCF绑定的服务:

 <bindings>
  <webHttpBinding>
    <binding name="webHttpBindingAuth">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Ntlm"/>
      </security>
    </binding>
  </webHttpBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)

使用Fiddler,我可以成功调用服务GET和POST上的方法,并提供了我调整我们发送给Web服务的JSON(例如包含会话ID),它很快就会顺利进行.

当我们尝试使用JavaScript/jQuery来调用web服务时,问题就出现了; 我们的想法是Web服务器将HTML/JS提供给客户端浏览器,然后浏览器应该调用WCF Web服务来获取会话并允许用户执行一些操作(我们总共有3个方法).

首先,我们遇到了X-Domain问题,我们试图通过让Web服务器返回正确的头文件来解决这个问题(Access-Control-Allow-Origin).这并没有阻止像SRIron这样的浏览器告诉我们;

XMLHttpRequest cannot load http://{webServiceUri}/InstantMessagingService/chat/start/{username}. Origin http://{web**Server**Uri} is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)

在此之后,我调查了使用Silverlight的可能性(似乎不支持NTLM auth over WebHttpBinding),反向代理已经出来,因为在dev中使用的IIS服务器将不会用于prod(我相信它是WebSphere,但不在我们的控制之下); 接下来我看了看这个:

http://msmvps.com/blogs/paulomorgado/archive/2007/04/27/wcf-building-an-http-user-agent-message-inspector.aspx

这让我觉得WCF Web服务实际上是需要告诉浏览器允许调用它的东西(如果这是有道理的).实现了示例中的所有代码之后,我发现从未调用过ApplyClientBehavior来尝试将标头返回给客户端(也在Fiddler中监控它).更多谷歌搜索引导我:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/707aa031-f4ff-47ab-ba5b-730f7930605e/

由于我们使用jQuery而不是某些.NET客户端/服务引用/代理/应用程序访问Web服务,所以我认为不可能预先请求发送这些标头以允许访问服务.此外,Fiddler似乎认为它正在尝试调用http://../chat/start/ ..方法时获得401 Unauthorized .

这是我用来尝试进行调用的jQuery(我提供了一些设置,希望它能够正常工作):

var url = webserviceUrl + "chat/start/" + remoteUserUri;

$.ajax({
    type: 'GET',   
    url: url,
    crossDomain: true,
    beforeSend: function(xhr){ xhr.withCredentials = true; },
    contentType: "application/json; charset=utf-8",               
    success: function …
Run Code Online (Sandbox Code Playgroud)

authentication rest wcf jquery json

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

使用transportCredentialOnly安全性对RESTful WCF服务的跨域Ajax JSON POST支持

我之前已经发布了这个主题,但经过一年的其他事情,我已经设法再次进入泡菜.我将尝试简要概述一下场景以及当前使事情有效的尝试:

  • 在主机上托管HTML,JS等的IIS Web服务器:iis.mycompany.com(简称foo)
  • 通过主机上的Windows服务托管的WCF RESTful Web服务:wcf.mycompany.com(简称bar)

foo服务的Javascript 通过对条形码上的WCF服务进行RESTful ajax调用(GETPOST取决于操作),显然这些是跨域调用,因为它们不在同一主机上.

Javascript使用jQuery(1.7.2)框架来操作DOM并执行对bar的 ajax调用,期望的内容类型为POSTSis JSON,并且响应来自GETS预期JSON(application/json).

Bar使用TransportCredentialOnly作为安全模式配置的WCF服务和传输客户端凭证类型NTLM,因此只有authed用户才能联系服务.

使用WCF的扩展已经为bar的 WCF服务添加了CORS支持:

http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx

我们添加了额外的标题,并根据众多互联网文章对已经包含的帖子进行了修改:

property.Headers.Add("Access-Control-Allow-Headers", "Accept, Content-Type");
property.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
property.Headers.Add("Access-Control-Max-Age", "172800");
property.Headers.Add("Access-Control-Allow-Origin", "http://iis.mycompany.com");
property.Headers.Add("Access-Control-Allow-Credentials", "true");
property.Headers.Add("Content-type", "application/json");
Run Code Online (Sandbox Code Playgroud)

提供有关启用CORS的信息的站点建议应该将Access-Control-Allow-Origin响应头设置为,"*"但在我们的情况下这是不可能的,因为我们使用以下设置进行jQuery ajax调用:

$.ajaxSetup({
  cache: "false",
  crossDomain: true,
  xhrFields: {
    withCredentials: true
  }
});
Run Code Online (Sandbox Code Playgroud)

事实证明, …

javascript authentication rest wcf cross-domain

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

ASP.NET用户/会员/ MembershipUser/Security/Principal/Profile ...帮助

我知道这可能听起来像到处都有解释的东西..但我一直在看很多asp.net /阅读视频阅读文章 - 但仍有一些东西缺失,这解释了所有这些"会员"如何联系在一起.

一方面,有这个内置的.net用户管理,允许你创建角色,用户等.然而另一方面,获取该用户,存储它(在会话等)似乎是一个奇怪的任务,从我已阅读,涉及创建自己的'Principal'对象等.

如果有人有理解和时间,他们能否给我们(我)一个简短的解释,说明这一切是什么.也许它是如何联系在一起的......我如何使用字符串用户名/密码来查看帐户是否存在,登录,检查它们是否处于正确的行动角色中?甚至可以获得用户的所有角色是其一部分?

我知道这个问题对于那些已经了解.net用户的人来说可能不太顺利,但是如果你能提供帮助,请回答.

提前谢谢了.peteski

.net c# asp.net security asp.net-membership

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

在AuthenticationContext中使用UserPasswordCredential进行身份验证时,使用GraphServiceClient获取刷新令牌

真诚的道歉,如果我错过了这篇文章的内容,因为我在读完了几个小时之后我的智慧结束了.

我正在尝试编写一个后端服务(Windows),它将通过Azure AD连接到MS Graph API.我正在使用C#来破坏概念验证,但是在MS文档,博客等方面遇到了很多问题,这些问题相当令人费解并且质量很差.他们似乎都认为他们的API的消费者是前端桌面或基于浏览器的应用程序.

无论如何,我设法使用服务帐户的UserPasswordCredential连接到Graph,我在AuthenticationContext响应中收到一个令牌,但没有刷新令牌信息.MSDN建议该方法可能会返回刷新信息,但嘿嘿,它可能不会.

此外,阅读(或尝试阅读)ADAL 3上的博客文章(从2015年开始):

http://www.cloudidentity.com/blog/2015/08/13/adal-3-didnt-return-refresh-tokens-for-5-months-and-nobody-noticed/

让我对刷新现在的工作方式感到困惑.这篇文章似乎暗示着令人神奇的是令牌在缓存中为你刷新,但在用我的POC测试之后情况并非如此.

我也从MS中看到了这篇文章,似乎在标题中指出:

https://msdn.microsoft.com/en-us/office/office365/howto/building-service-apps-in-office-365

然而,需要你注册应用程序,跳过弹出式箍允许访问等等.

由于我的样本正在运行,我已经尝试安排重新认证,希望在获得初始令牌(持续60分钟)后50分钟获得新令牌但是我得到相同的令牌.这意味着在60分钟1秒内,通过客户端的任何调用都会抛出异常(ServiceException,我必须检查里面的文本以查看令牌到期相关信息).对我来说,无法重新验证和刷新令牌以继续使用客户端进行更"无缝"的使用是没有意义的.

这是我的代码的精简版示例:

namespace O365GraphTest
{
    using Microsoft.Graph;
    using Microsoft.IdentityModel.Clients.ActiveDirectory;
    using Nito.AsyncEx;
    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Threading.Tasks;
    using System.Linq;
    using System.Threading;
    using System.Security;

    public class Program
    {
        // Just use a single HttpClient under the hood so we don't hit any socket limits.
        private static readonly HttpProvider HttpProvider = new HttpProvider(new HttpClientHandler(), false);

        public static void Main(string[] args)
        {
            try
            {
                AsyncContext.Run(() => …
Run Code Online (Sandbox Code Playgroud)

c# authentication azure oauth-2.0 microsoft-graph

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

Visual Studio 2008,如何在退格而不是空格时将其设置为删除标签?

在Visual Studio 2008中,似乎当我在一行上选中它时会插入4个空格或一个制表符,但是当我退格时它会删除一个制表符,好像它是4个空格,一次一个空格.

我检查了工具中的文本编辑器设置..尝试使用空格和使用选项卡,似乎都不起作用.

有任何想法吗?

提前致谢.皮特

tabs editor visual-studio-2008 visual-studio

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

MS Graph API C#将用户添加到组

我一直在调查如何使用Microsoft Graph API(nuget上可用的dotnet/C#库)从Azure AD组添加(以及稍后删除)用户.

Nuget MS Graph API

忽略所有其他的连接GraphServiceClient等等.我正在尝试与下面的示例非常相似的代码,没有得到任何异常(建议事情很好)但是当我再次通过API获得该组时,它仍然没有任何成员!

修改尝试后返回组对象的快速监视

有趣的是(作为旁白),当我memberOfuser对象上请求属性并告诉它扩展它时,它仍然返回null.

var user = await client.Users[userPrincipalName]
             .Request()
               .Select("id,memberOf")
                 .Expand("memberOf")
                   .GetAsync();

var group = await client.Groups[groupId]
              .Request()
                .Select("members")
                  .Expand("members")
                    .GetAsync();

group.Members.Add(user);

await client.Groups[groupId].Request().UpdateAsync(group);

// userPrincipalName => "test.user@mytenant.com"
// groupId => the object GUID for the group
Run Code Online (Sandbox Code Playgroud)

有谁知道我在这里做错了什么?我用来提供此代码的文档基于以下文档的链接:

'group'的API文档

将成员添加到组

此外,我尝试在此处建议的解决方案上设置方法,为用户设置许可证:

通过Graph API分配用户许可证

像往常一样,谢谢你的帮助.

彼得

额外

我也尝试在图API中寻找可能更新.Members属性/资源而不是组本身:

await client.Groups[groupId].Members.Request(). // <-- Only has GetAsync()
Run Code Online (Sandbox Code Playgroud)

但它只有GetAync()可用的方法.

根据答案更新

var usersGroups = await client.Users[userPrincipalName].MemberOf.Request().GetAsync();

if (!usersGroups.Any(g …
Run Code Online (Sandbox Code Playgroud)

c# api azure microsoft-graph

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

SQL Server (2008) 创建具有唯一行的链接表

我在联系 SQL Server Managemen Studio 2008 时遇到问题!我想创建一个链接表,将事件链接到许多受众 (EventAudience)。

可能包含的数据示例:

事件 ID | 观众ID

  4              1
  5              1
  4              2
Run Code Online (Sandbox Code Playgroud)

但是,我不想要这个:

事件 ID | 观众ID

  4              1
  4              1
Run Code Online (Sandbox Code Playgroud)

我一直在寻找关系和约束......但到目前为止没有快乐!

作为问题的第二部分,我想设置 Audience 表,以便如果从 Audience 中删除一行,它将以级联方式清除 EventAudience 链接表。

一如既往,感谢任何帮助/建议!

谢谢皮特

database sql-server database-design

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

Autofac将数据注入OWIN Startup类

我一直在寻找SO一段时间,但找不到我特定问题的答案:

如何使用Autofac将数据(通过构造函数或属性)注入到OWIN Startup类中?

我在Windows服务中使用Autofac,它也处理后端服务的创建等.所以我在那里进行所有配置读取和容器构建.

我希望能够注册Startup类,这样我就可以为CORS注入允许的原点,但即使我用这样的属性注册对象:

var builder = new ContainerBuilder();
// This will actually be read from config.
var origins = new[]
              {
                  "http://localhost",
                  "http://localhost:8082",
              };
builder.Register(c => new Startup(origins));
var container = builder.Build();
Run Code Online (Sandbox Code Playgroud)

在运行时,实例化Startup类时,callstack显示它来自外部代码,而我的Autofac构建器没有推送该属性.

理想情况下,我希望将Autofac注册保存在一个地方(Windows服务类),然后将所需数据注入Startup,这样我就可以执行以下操作(将allowedOrigins其设置为属性或通过构造函数注入)

 public void Configuration(IAppBuilder app)
 {
     var configuration = new HttpConfiguration();
     ...
     var origins = string.Join(",", allowedOrigins);
     var cors = new EnableCorsAttribute(origins, "*", "*") { SupportsCredentials = true };
     configuration.EnableCors(cors);
     ....
 }
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激.谢谢

peteski

UPDATE

我应该补充一点,在尝试Autofac注册和构建之后,我开始执行以下操作来启动OWIN自我主机应用程序:

var webApp = WebApp.Start<Startup>(baseAddress);
Run Code Online (Sandbox Code Playgroud)

通过与朋友的对话,他们建议创建Startup对象并将其传递给 …

c# dependency-injection autofac owin asp.net-web-api2

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