OWIN OpenIdConnect中间件 - 动态设置RedirectUri

Ant*_*nek 7 middleware owin openid-connect

有什么方法可以根据请求范围而不是应用程序范围为OpenIdConnectMessage设置RedirectUri属性?

我的应用程序服务于多个域(myapp.com,myapp.fr,..),并且基于域,它确定内容的默认语言.我需要在登录到IdP之后将用户带回到同一个域,因此我需要找到一种方法,如何通过在startup.cs中配置中间件选项来完成每个请求范围而不是应用范围设置RedirectUri.

Ant*_*nek 12

这可以通过Notification活动来完成RedirectToIdentityProvider.像这样的东西:

 Notifications = new OpenIdConnectAuthenticationNotifications
                 {
                     RedirectToIdentityProvider = async n =>
                     {
                         n.ProtocolMessage.RedirectUri = n.OwinContext.Request.Uri.Host;
                         n.ProtocolMessage.PostLogoutRedirectUri = n.OwinContext.Request.Uri.Host;
                     },
                     //other notification events...
                 }
Run Code Online (Sandbox Code Playgroud)

`

  • 我知道这是一个老问题,但我正在开发旧版 .NET Framework 4.7.2 应用程序。我试图使用这种方法在 RedirectToIdentityProvider 中动态设置“RedirectUri”,但它会导致异常“Error: 'invalid_grant'”。Error_Description(可能为空):“不正确的redirect_uri”。但是,如果我仅在“OpenIdConnectAuthenticationOptions”中的应用程序启动时设置“RedirectUrl”属性,它就可以正常工作。我在网上找不到任何其他参考来更改导致此问题的 RedirectUri。有什么建议么? (2认同)

Chr*_*ris 5

如果您使用的是ResponseType = OpenIdConnectResponseType.CodeIdToken,则需要设置RedirectUri几个通知事件。

AuthorizationCodeReceived通知中,您可以设置RedirectUrionTokenEndpointRequest以确保在令牌请求中也传递相同的值。

RedirectToIdentityProvider = n =>
{
    n.ProtocolMessage.RedirectUri = redirectUrl;
    // other settings   
}
Run Code Online (Sandbox Code Playgroud)
AuthorizationCodeReceived = n =>
{
    n.TokenEndpointRequest.RedirectUri = redirectUrl;
    // other settings   
}
Run Code Online (Sandbox Code Playgroud)