登录AzureADB2C后如何重定向以返回URL

时间:2020-06-09 10:35:08

标签: asp.net-core azure-ad-b2c blazor

我有一个具有AzureADB2C身份验证的Blazor服务器应用程序。我将路径用于不同的项目,例如〜/ project1或〜/ project2。用户有权访问由另一个服务管理的不同项目。

未经授权的用户导航到〜/ project1时,他将被重定向到这样的登录页面

MainLayout.razor

<AuthorizeView>
    <Authorized>
...
    </Authorized>
    <NotAuthorized>
        <RedirectToLogin />
    </NotAuthorized>
</AuthorizeView>

使用AzureADB2C.UI软件包中的一些经过修改的代码进行RedirectToLogin

            var uri = new Uri(_navigationManager.Uri);
            var redirectUri = "~" + uri.AbsolutePath;
            _navigationManager.NavigateTo($"AzureADB2C/Account/SignIn?redirectUri={redirectUri}", true);

修改看起来像

        [HttpGet("{scheme?}")]
        public IActionResult SignIn([FromRoute] string scheme, [FromQuery] string redirectUrl)
        {
            scheme ??= AzureADB2CDefaults.AuthenticationScheme;
            return Challenge(
                new AuthenticationProperties { RedirectUri = Url.Content(redirectUrl) },
                scheme);
        }

AzureADB2C中的重定向URI为http://localhost:44377/signin-oidc 我在〜/页面结束。

我在这里完全迷路了,在这里看到的唯一解决方案是用于存储和恢复redirectUrl的cookie

1 个答案:

答案 0 :(得分:1)

您可以通过在Azure AD请求中添加“ state”参数来保留应返回用户的URI,请参见https://docs.microsoft.com/en-us/azure/active-directory-b2c/openid-connect上的说明

一种实现方式:

  1. 使用ReturnUri属性创建一些对象,并设置返回用户所需的值。
  2. 将对象序列化为JSON并编码为BASE64以获取纯字符串。
  3. 将此字符串添加为“状态”参数值:
    _navigationManager.NavigateTo($"AzureADB2C/Account/SignIn?redirectUri={redirectUri}&state={your_object_as_encoded_string}", true);
  1. 一旦用户返回您的重定向URI,您只需从当前URI值中获取state参数(Azure会将State参数返回给您)。
  2. 解码和反序列化状态对象,并将客户端重定向到正确的URL。