asp.net-mvc - ASP.NET MVC 与 Azure B2C 刷新 ID token 问题

标签 asp.net-mvc azure token refresh

我正在开发一个带有 Azure B2C 身份验证的 ASP.NET MVC 应用程序。要求在ID token 过期后(IIS session 未过期),任何后续操作调用都应自动使用刷新 token 刷新ID token ,然后继续执行而无需重新登录。

问题:

  1. 该解决方案有意义吗?
  2. 刷新 ID token 并设置 Cookie 后,如何重定向到原始 URL 并继续执行而无需重新登录?

谢谢,任何想法都将受到高度赞赏。

这是我的代码:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    var refreshToken = HttpContext.Current.Request.Cookies["msal.refreshtoken"];

    if (refreshToken != null && !string.IsNullOrEmpty(refreshToken.Value))
    {
        var newIdToken = TokenService.RefreshIdToken(refreshToken.Value);

        var idTokenCookie = new HttpCookie("msal.idtoken", newIdToken)
            {
                Secure = true,
                HttpOnly = true
            };

        HttpContext.Current.Response.Cookies.Set(idTokenCookie);

        return;
    }
}


// TokenService.RefreshIdToken
public static string RefreshIdToken(string refreshToken)
{
    var policyName = ConfigurationManager.AppSettings["ida:SignUpSignInPolicyId"];
    var B2CDomain = ConfigurationManager.AppSettings["ida:B2CDomain"];
    var tenant = ConfigurationManager.AppSettings["ida:Tenant"];
    var clientId = ConfigurationManager.AppSettings["ida:ClientId"];
    var clientSecret = ConfigurationManager.AppSettings["ida:ClientSecret"];
    var tokenEndpointUri = $"https://{B2CDomain}/{tenant}/{policyName}/oauth2/v2.0/token";
    var httpClient = new HttpClient();

    var requestBodyDict = new Dictionary<string, string>
        {
            { "grant_type" , "refresh_token" },
            { "client_id" , clientId },
            { "client_secret" , clientSecret },
            { "scope" , $"openid" },
            { "refresh_token" , refreshToken }
        };

    var request = new HttpRequestMessage
        {
            RequestUri = new Uri(tokenEndpointUri),
            Method = HttpMethod.Post,
            Content = new FormUrlEncodedContent(requestBodyDict)
        };

    var task = Task.Run(() => httpClient.SendAsync(request));
    task.Wait();

    var response = task.Result;

    var task1 = Task.Run(() => response.Content.ReadAsStringAsync());
    task1.Wait();
    var responseString = task1.Result;

    if (response.IsSuccessStatusCode)
    {
        var idToken = (string)JsonConvert.DeserializeObject<dynamic>(responseString).id_token.ToString();
        return idToken;
    }
    else
    {
        throw new Exception();
    }
}

最佳答案

一些太长的想法,无法发表评论:

  1. 是的,“使用刷新 token 获取新的 ID token ”的基本思想就是它应该如何工作。

  2. 谷歌搜索这个问题会发现一系列令人眼花缭乱的例子来模仿:-(例如Microsoft’s Azure Samples on GitHub for A/D auth for a web app(而不是webapi或SPA)

  3. 解决此类身份问题的基本计划是,找到一个权威的示例并遵循它,因为这可以减少出现令人尴尬的错误的风险。 (例如,Auth0’s example for this scenario表示获取新的refresh_token以及新的id_token。不这样做可能没问题,但当刷新 token 过期时,用户将被迫重新登录。然后 您可能会想使用超长生命周期的刷新 token ,从而稍微放松您的安全性)

  4. 如果你找不到权威的例子,可以考虑 raising an issue or commenting on one .

OTOH,如果您编写的代码有效,那么也许您已经完成了!

在开始之后寻找一个可以模仿的示例的问题是尝试为您已经做出的技术选择找到正确的示例。从空项目开始,按照教程进行操作,让教程发挥作用,然后将解决方案复制回您的应用程序可能会更容易。

要将您的用户送回原来的目标,您应该能够

var originalUrl= HttpContext.Current.Request.Url;
HttpContext.Current.Response.Redirect(original);

但只有在成功获取 id_token 时才执行此操作,否则会造成无限循环。

关于asp.net-mvc - ASP.NET MVC 与 Azure B2C 刷新 ID token 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75075860/

相关文章:

javascript - Angular JS $http POST 在 ASP.NET MVC 中成功时没有响应

python - Azure blob 共享 key 创建 403 错误获取

c# - ASP.Net Core AzureAD 身份验证有效,但登录和注销无效

java - 404 访问 https URL 时出错 - Java,但使用 POSTMAN 或 SOAPUI 工作正常

mysql - SQL - 最大长度255唯一索引 - 哈希解决方案

javascript - 如何将 jwt token 应用于生成的 Angular 2 JS 文件?

c# - 检测页面是否在 iframe 中 - 服务器端

c# - 如何使用 Orchard.Forms 插入保存按钮?

c# - MiniProfiler 不显示

c# - 数据库优先和 Entity Framework 动态连接字符串