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

Posted

技术标签:

【中文标题】带有 Microsoft.Owin.Security.OpenIdConnect 和 AzureAD v 2.0 端点的自定义参数【英文标题】:Custom parameter with Microsoft.Owin.Security.OpenIdConnect and AzureAD v 2.0 endpoint 【发布时间】:2016-09-26 04:13:44 【问题描述】:

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

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

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

我正在寻找利用“状态”参数described in OAUTH flow。但是,I am using Microsoft.Owin.Security.OpenIdConnect 看起来参数已经设置好了,所以我无法利用它。我正在使用基于 MVC 的流程实现,类似于 this sample。

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

【问题讨论】:

这里有人问过:feedback.azure.com/forums/169401-azure-active-directory/… 【参考方案1】:

不确定是否有正式的方式来满足您的要求,但您可以通过身份验证流程在技术上注入和提取额外值的一种方式是通过 OWIN 的通知。

在 Startup.Auth.cs 中,当您设置 OpenIdConnectAuthenticationOptions 时,您将添加以下内容:

app.UseOpenIdConnectAuthentication(
  new OpenIdConnectAuthenticationOptions
  
    //...
    Notifications = new OpenIdConnectAuthenticationNotifications
    
      RedirectToIdentityProvider = OnRedirectToIdentityProvider,
      MessageReceived = OnMessageReceived
    ,
  );

并使用 RedirectToIdentityProvider 注入您的参数,类似于:

private Task OnRedirectToIdentityProvider(RedirectToIdentityProviderNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)

  var stateQueryString = notification.ProtocolMessage.State.Split('=');
  var protectedState = stateQueryString[1];
  var state = notification.Options.StateDataFormat.Unprotect(protectedState);
  state.Dictionary.Add("mycustomparameter", "myvalue");
  notification.ProtocolMessage.State = stateQueryString[0] + "=" + notification.Options.StateDataFormat.Protect(state);
  return Task.FromResult(0);

然后使用 MessageReceived 将其提取出来,如下所示:

private Task OnMessageReceived(MessageReceivedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)

  string mycustomparameter;
  var protectedState = notification.ProtocolMessage.State.Split('=')[1];
  var state = notification.Options.StateDataFormat.Unprotect(protectedState);
  state.Dictionary.TryGetValue("mycustomparameter", out mycustomparameter);
  return Task.FromResult(0);

您显然需要改进/强化这一点,但这应该会让您除非采用更好的整体方法。

【讨论】:

谢谢。我会对此进行调查。 它可以工作,但这会使我们的流程复杂化。从 OpenIdConnect 和 OAUTH 规范中不清楚是否应该允许带有查询参数的回复 url。我想请微软支持这一点。 根据thread-safe.com/2014/05/…,重定向 uri 被显式删除,状态变量是您应该将其全部放入的变量 看来Azure Active Directory Developer support team's blog 已经引用了这个答案,所以这是相当官方的。 this Microsoft book 也暗示了这种方法。

以上是关于带有 Microsoft.Owin.Security.OpenIdConnect 和 AzureAD v 2.0 端点的自定义参数的主要内容,如果未能解决你的问题,请参考以下文章

带有和不带有聚合的 sql 查询

如何翻转正面带有标签而背面带有另一个标签的视图 - 参见图片

CakePHP 如何处理带有/不带有 'id' 字段的 HABTM 表?

带有滚动的 Div 和带有绝对位置的内容

带有 RecyclerView 的 DialogFragment 比带有 Recyclerview 的 Fragment 慢

访问控制允许带有和不带有 www 的来源