在AuthorizeAttribute中获取AD组/,同步和异步问题

时间:2017-10-18 11:46:33

标签: c# asynchronous graph active-directory authorization

对于MVC Web应用程序,我已经了解了几种获取Active Directory用户组(和角色)的方法。

使用的模板由Microsoft提供:
       https://developer.microsoft.com/en-us/graph/docs/concepts/get-started(Microsoft Graph API,ASP.NET,Azure AD v2.0端点,SDK示例)

即使在Application Manifest(apps.dev.microsoft.com)中启用,Microsoft也不会返回组声明。显然,如果用户超过5组,则组不会返回。所以我试图通过GetMemberObjects调用来获取组和角色。

我希望在自定义AuthorizeAttribute类中获取用户的组和角色,但是会出现问题......

  • Microsoft Graph库中的API调用是异步的。见例子:
    await client.Me.GetMemberObjects(true).Request().PostAsync()
  • AuthorizationAttribute中的可覆盖方法不允许异步任务,这意味着我不能 在await等方法中使用OnAuthorization,并使用async void投掷 异常。
  • .Result尝试阻塞同步调用也不起作用,因为上下文被阻止 - 完成异步任务无法返回主上下文,因此发生死锁(无限页面加载)。与GetAwaiter().GetResult()相同的问题。
  • .ConfigureAwait(false)添加到所有等待中都不起作用,因为Graph库我假设内置等待我无法配置为false。
  • 自定义类重写ClaimsAuthenticationManage的ClaimsPrincipal Authenticate永远不会被访问,即使我已正确设置web.config。我的计划是获取组并在后者填充后将其作为声明添加到ClaimsPrincipal,但是这种技术可能也会失败,因为无法将可覆盖的方法更改为返回{{1 }}。

解决方案:

  • 在异步方法中等待异步任务,我唯一能想到的地方就是 在控制器中。这种方法确实有效,但不是好的做法。或者我明白了。
  • 使用ASP.NET vNext?不确定这一点,但我想保持常规.NET。
  • 使用REST版本的模板。实际上,同步API调用在测试时起作用:Task<ClaimsPrincipal>,但问题是 在尝试获取访问令牌时仍然存在。 client.SendAsync(request).ResultIAuthProvider.GetUserAccessTokenAsync,因此async在所有后续父母中都是必需的,因为await将在100%的时间内陷入僵局。所以我会再次陷入.Result
  • void OnAuthorization不传递httpContext并且线程不安全。如果没有别的办法,我打算把它作为最后的手段。

理想情况下,我希望在Task.Run(()=>Method())OnAuthorization中获取用户的组和角色,以检查某个控制器操作的授权。但是,如果有其他方式......建议?感谢。

0 个答案:

没有答案