小编Ben*_*tra的帖子

钩子事件Outlook VSTO在主线程上继续工作

我开发了一个Outlook VSTO插件.某些任务应该在后台线程上完成.通常,检查本地数据库中的某些内容或调用Web请求.阅读了几篇文章之后,我放弃了在后台线程中调用Outlook对象模型(OOM)的想法.

我有一些wpf控件,我成功地设法使用.NET 40 TPL执行异步任务,并在完成时"完成"主VSTA线程中的作业(即访问UI或OOM).

为此,我使用了以下形式的语法:

Task<SomeResult> task = Task.Factory.StartNew(()=>{
    //Do long tasks that have nothing to do with UI or OOM
    return SomeResult();
});

//now I need to access the OOM
task.ContinueWith((Task<SomeResult> tsk) =>{
   //Do something clever using SomeResult that uses the OOM
},TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但现在我想在OOM中挂钩没有Form/WPF控件的事件时做类似的事情.确切地说,我的问题来自于TaskScheduler.FromCurrentSynchronizationContext()抛出异常的事实.

例如,

Items inboxItems = ...;
inboxItems.ItemAdd += AddNewInboxItems;

private void AddNewInboxItems(object item)
{
    Task<SomeResult> task = Task.Factory.StartNew(()=>{
    //Do long tasks that have nothing to do with OOM
    return SomeResult()});


   var scheduler = …
Run Code Online (Sandbox Code Playgroud)

c# outlook multithreading vsto outlook-addin

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

NameIdentifier vs ObjectIdentifier

我有一个多租户ASP.NET应用程序使用OpenIdConnect和Azure AD作为Office 365的身份提供程序.当用户通过身份验证后,我收到了我的声明ClaimsPrincipal.Current.

我想识别用户并将此id引用存储在我的数据库中.我问了这个问题.有人回答说

当尝试唯一地识别用户时[NameIdentifier]应该是您的首选.

但似乎NameIdentifier声称,http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier 取决于应用程序.确切地说,如果我在Azure AD中创建另一个应用程序,那么NameIdentifier对于同一个真正的 Office365用户来说,它们将是不一样的.请记住,我们可能必须创建另一个Azure AD清单(因为我们可能需要其他范围),我们应该能够找回相同的最终用户.

与此同时,我评论了另一个主张: ObjectIdentifier http://schemas.microsoft.com/identity/claims/objectidentifier

ObjectIdentifier对于给定的Office 365用户,所有Azure AD保护的应用程序似乎都是相同的.

你能准确解释这两种说法之间的区别吗?更重要的是,您是否可以确认ObjectIdentifier可以在任何Office 365订阅中将其用作用户的"通用"标识符.

claims-based-identity azure-active-directory office365api azure-ad-graph-api

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

在哪里可以找到 Azure 应用服务的 docker 容器日志

我确实有一个运行 .net core 2 应用程序的 Docker 容器。

使用此代码配置日志记录 Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddConsole();
            logging.AddDebug();
        })
        .UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)

appsettings.json文件

{
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  },
}
Run Code Online (Sandbox Code Playgroud)

日志好像还可以,直接运行Kestrel的时候,可以在终端看到日志。同样的事情,当容器化时:命令docker logs显示了我想要的。

在 Azure Web App 中作为容器运行时,生产中会出现问题。我找不到任何一致的 docker 日志。

我尝试通过 FTP 或通过 urlhttps://[mysite].scm.azurewebsites.net/api/logs/docker访问日志文件,例如,日志文件几乎为空 https://[mysite].scm.azurewebsites.net/api/vfs/LogFiles/2018_09_09_RD0003FF74F63E_docker.log,仅存在容器起始行 在此处输入图片说明

此外,我在通常的门户界面中也有相同的行。

问题是:Azure Web App 的 docker.log 文件中会自动输出 docker 日志吗?有什么我想念的吗?

c# azure docker azure-web-app-service azure-web-app-for-containers

13
推荐指数
2
解决办法
2万
查看次数

在一个DocumentDb集合中存储不同的文档类型

我们有一个多租户应用程序,它使用Azure DocumentDB作为我们的NoSQL文档导向数据库.

对于多租户,我们会阅读此问题此博客文章.因为现在我们的用户数量不满足使用不同数据库的需要和/或documentCollections更重要的是,为了节省成本,我们在TenantId字段上使用"Where"子句实现多租户documentCollection.

类似地,当涉及存储具有完全不同性质的"文档"或"对象"时(例如BookCar),我们对使用它的事实提出质疑documentCollection.

首先,创建两个不同的documentCollectionfor Book和看起来更合理Car.但是,documentCollection最低成本为25美元.我们不想每次需要添加新功能时支付+ 25美元,即使它是存储少量数据(例如我们的应用程序存储了很多Books但很少Cars......).

把书和车放在一起是一个好的设计documentCollection吗?并在共享成员中保留对文档类型的引用(例如string Type ="Book" or string Type = "Car").

知道我们已经使用Where"子句"实现了多租户,在我们的应用程序中查询给定租户的所有汽车,我们的查询都将包含Where TenantId ="XXXX" AND Type = "Car".

我已经看到DocumentDB现在支持Partitioned Collection.这可能是对分区的良好使用,或者相反,它们应该保持以实现更好的可伸缩性,并且不适合隔离其对象数量可能不相似的不同文档类型?

azure azure-cosmosdb

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

使用OWIN和ASP.NET WEB API的基本认证中间件

我创建了一个ASP.NET WEB API 2.2项目.我使用基于Windows Identity Foundation的模板为visual studio中提供的个人帐户在此处查看.

Web客户端(用angularJS编写)使用带有Web浏览器cookie的OAUTH实现来存储令牌和刷新令牌.我们受益于有用的UserManagerRoleManager类,用于管理用户及其角色.使用OAUTH和Web浏览器客户端一切正常.

但是,对于基于桌面的客户端的一些复古兼容性问题,我还需要支持基本身份验证.理想情况下,我希望[授权],[授权(角色="管理员")]等属性与OAUTH和基本身份验证方案一起使用.

因此,遵循LeastPrivilege的代码,我创建了一个继承自AuthenticationMiddleware的OWIN BasicAuthenticationMiddleware.我来到以下实现.对于BasicAuthenticationMiddleWare,与Leastprivilege的代码相比,只有Handler发生了变化.实际上我们使用ClaimsIdentity而不是一系列Claim.

 class BasicAuthenticationHandler: AuthenticationHandler<BasicAuthenticationOptions>
{
    private readonly string _challenge;

    public BasicAuthenticationHandler(BasicAuthenticationOptions options)
    {
        _challenge = "Basic realm=" + options.Realm;
    }

    protected override async Task<AuthenticationTicket> AuthenticateCoreAsync()
    {
        var authzValue = Request.Headers.Get("Authorization");
        if (string.IsNullOrEmpty(authzValue) || !authzValue.StartsWith("Basic ", StringComparison.OrdinalIgnoreCase))
        {
            return null;
        }

        var token = authzValue.Substring("Basic ".Length).Trim();
        var claimsIdentity = await TryGetPrincipalFromBasicCredentials(token, Options.CredentialValidationFunction); …
Run Code Online (Sandbox Code Playgroud)

claims-based-identity wif owin asp.net-web-api2 asp.net-identity-2

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

Microsoft.Owin.Security.OpenIdConnect与Azure Active Directory身份验证票证生存期

我建立一个连接处使用365个服务的多租户Web应用程序Microsoft.Owin.Security.OpenIdConnect,版本= 3.0.0.0和天青与Active Directory Microsoft.IdentityModel.Clients.ActiveDirectory,版本= 2.19.0.0下面这个样本.

我们的Web应用程序客户端(用户代理)使用asp.NET cookie对我们的服务器进行身份验证,而我们的服务器和授权服务器(此处为Azure AD)之间的身份验证是使用OpenID授权代码流进行的.

我们为Asp.NET cookie设置了30天的滑动到期时间.但是,即使设置了UseTokenLifetime = true,我们仍然有来自Authority Server的短暂的AuthenticationTicket,它应该与两个身份验证机制的生命周期相匹配.短期身份验证票证

我们遇到的问题是:我们的最终用户必须经常重新登陆(少于一小时).问题是,我们如何在这个owin openidconnect中间件中增加/更改身份验证票证的生命周期?

备注:我还发布了一个关于ADAL使用刷新令牌的问题.根据我们的理解,此问题仅与身份验证有关.作为ActiveDirectory客户端管理的授权问题的access_tokenrefresh_token的生存期与此问题无关.如果我错了,请纠正我.

Startup.Auth.cs

public partial class Startup
{
  public const string CookieName = ".AspNet.MyName";
  public const int DayExpireCookie = 30;

  public void ConfigureAuth(IAppBuilder app)
  {
   app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

   var cookieAuthenticationOptions = new CookieAuthenticationOptions()
   {
       CookieName = CookieName,
       ExpireTimeSpan = TimeSpan.FromDays(DayExpireCookie),
       AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
       SlidingExpiration = true,
   };

   app.UseCookieAuthentication(cookieAuthenticationOptions);

   app.UseOpenIdConnectAuthentication(
       new OpenIdConnectAuthenticationOptions
       {
           ClientId = …
Run Code Online (Sandbox Code Playgroud)

office365 owin azure-active-directory adal openid-connect

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

带有 Microsoft.Owin.Security.OpenIdConnect 和 AzureAD v 2.0 端点的自定义参数

我正在将 Azure AD 安全应用程序迁移到 v2.0 端点。

我需要将自定义参数传递给回复 uri。对于以前的 Azure AD 端点,我通过向回复 url 添加一个常用的查询参数来做到这一点。e.g. https://myserver.com/myredirect_uri?mycustomparamerter=myvalue

不幸的是,在端点 2.0 中,我收到一条错误消息,指出回复 uri 与注册的 uri 不匹配。当然,我的自定义参数值是动态的,我无法对其进行硬编码。

我希望利用OAUTH flow 中描述的“状态”参数。但是,I am using Microsoft.Owin.Security.OpenIdConnect看起来参数已经设置,所以我无法利用它。我正在使用一个基于 MVC 的流程实现,它看起来像这个示例

您能否提出一种解决方法,以便我的服务器在流程开始时设置的回复 url 中接收自定义参数?

azure owin azure-active-directory openid-connect

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

使用Office 365租户上的Graph API过滤"共享邮箱用户"

我按照此文档使用Graph API版本1.6列出了Office 365租户中的用户.

我想过滤作为用户引用的Office 365共享邮箱,然后在请求时返回/users/.(例如contact@contoso.com,support@contoso.com).

从我所看到的,没有办法区分代表共享邮箱的用户和"常规"用户.有人有机制来过滤这样的邮箱吗?不是在我的情况下,JSON成员userType总是如此null.

office365api azure-ad-graph-api

6
推荐指数
0
解决办法
489
查看次数

RESTAPINotEnabledForComponentSharedMailbox错误

我的用户无法使用我们的服务,因为Outlook REST API返回以下错误代码RESTAPINotEnabledForComponentSharedMailbox

看来他们的邮箱不是共享邮箱。那是什么样的邮箱?

您能告诉我更多有关此错误的信息吗?有什么可以做的吗?

outlook outlook-restapi office365api office365-restapi

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

EntityFramework:CascadeOnDelete仅在删除父对象时

我在使用EntityFramework和以下数据模型时遇到了一些麻烦(参见简化图).

在此输入图像描述

Matter对象可以被认为是"主要容器".有Bill和BillRecord.从Bill到BillRecord有一对多的关联.确切地说,Bill可以引用许多BillRecord(可能是0),BillRecord最多可以引用一个Bill.

1)我希望能够删除BillRecord但是如果存在关联则不应该删除Bill(这就是为什么我没有在BillRecords实体上设置OnCascadeDelete For Bill).同样,如果我删除一个账单,我不想删除可能与之关联的BillRecord.

2)然而,当我删除一个问题时,我希望一切都消失:问题,比尔和比尔记录.

使用以下代码,如果没有与Bill相关联的BillRecord,我设法有1)正确和2)工作,如果有,我得到以下错误.

System.Data.SqlServerCe.SqlCeException: The primary key value cannot be deleted because references to this key still exist. [ Foreign key constraint name = FK_dbo.BillRecordDboes_dbo.BillDboes_BillId ]
Run Code Online (Sandbox Code Playgroud)

这是我的实体和OnModelCreating的逻辑

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<MatterDbo>().HasMany<BillRecordDbo>(s => s.BillRecordDbos)
   .WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);

    modelBuilder.Entity<MatterDbo>().HasMany<BillDbo>(s => s.BillDbos)
    .WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
}

public class MatterDbo
{
    public MatterDbo()
    {
        BillDbos = new List<BillDbo>();
        BillRecordDbos = new List<BillRecordDbo>();
    }

    public Guid Id { get; set; }

    public virtual List<BillDbo> …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework sql-server-ce

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