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

时间:2016-05-27 18:16:09

标签: azure owin openid-connect azure-active-directory

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

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

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

我希望利用'state'参数described in OAUTH flow。但是,I am using Microsoft.Owin.Security.OpenIdConnect并且它看起来已经设置了参数,所以我无法利用它。我正在使用基于MVC的流的实现,看起来像this sample

您能否建议一种解决方法,以便我的服务器在回复网址中收到已在流程启动时设置的自定义参数?

1 个答案:

答案 0 :(得分:3)

不确定是否有正式方法可以做你要问的事情,但是通过认证流技术注入和提取额外值的一种方法是通过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);
}

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