gpt4 book ai didi

javascript - 使用 id_token 作为重定向 URL 中的参数的重定向用户导致身份用户为 Null

转载 作者:行者123 更新时间:2023-11-30 14:13:25 24 4
gpt4 key购买 nike

我一直在使用 AADB2C 身份验证,并努力将用户重定向到主页,并将 id_token 作为重定向 url 中的片段。下面是我如何在帐户 Controller 中发起身份验证挑战

public class AccountController : Controller
{
public AzureAdB2COptions AzureAdB2COptions { get; set; }

public AccountController(IOptions<AzureAdB2COptions> b2cOptions)
{
AzureAdB2COptions = b2cOptions.Value;
}
// GET: /<controller>/
[HttpGet]
public IActionResult SignUpSignIn()
{
var redirectUrl = "http://localhost:7878/dasdfsd/home";
return Challenge(
new AuthenticationProperties { RedirectUri = redirectUrl },
OpenIdConnectDefaults.AuthenticationScheme);

}
}

下面是我将用户重定向到重定向 url( http://localhost:7878/dgddfg/home ) 的地方,id token 与 url 一起碎片化

            public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
{

// Use MSAL to swap the code for an access token
// Extract the code from the response notification
var code = context.ProtocolMessage.Code;

string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, context.HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
try
{
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, AzureAdB2COptions.ApiScopes.Split(' '));
context.HandleCodeRedemption(result.AccessToken, result.IdToken);
context.HandleResponse();
context.Response.Redirect("dfgfd/home#grant_type=" + context.ProtocolMessage.GrantType + "&id_token=" + result.IdToken);
}
catch (Exception)
{
//TODO: Handle
throw;
}
}

当用户使用 javascript 重定向到主页时,我从 url 获取 id_token 并调用帐户 Controller 操作(“GetAccessTokenAsync”)以使用身份用户获取访问 token

 [HttpGet]
public async Task<string> GetAccessTokenAsync()
{
string signedInUserID = HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID , HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
try
{
var userAccounts = await cca.GetAccountsAsync();
if (userAccounts == null && userAccounts.Count()==0)
{
throw new Exception("The User is NULL. Please clear your cookies and try again. Specifically delete cookies for 'login.microsoftonline.com'. See this GitHub issue for more details: https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi/issues/9");
}
AuthenticationResult result = await cca.AcquireTokenSilentAsync(AzureAdB2COptions.ApiScopes.Split(' '),userAccounts.FirstOrDefault());
return result.AccessToken;

}
catch (Exception ex)
{
//TODO: Handle
return "";
}
}

这里的问题是操作方法中的 HttpContext.User 为空。但是如果我删除了我在 OnAuthorizationCodeReceived 中编写附加了 id_token 和 context.HandleResponse(); 的重定向 url 的部分,用户将在没有 id token 的情况下被重定向,但当执行 getAccessToken 操作时 HttpContext.User 不会为 null,用户将拥有包括声明在内的所有详细信息。

如何在 url 中使用 id token 重定向用户,并让用户不为 null 以在 Controller 方法中获取访问 token ?跟cookie有关吗?

最佳答案

我不知道为什么在 javascript 中需要 ID token ,ID token 包含用户个人资料信息(如用户名、电子邮件等),这些声明是关于用户的声明,但不应包含敏感信息。

如果您想获得用户声明,您可以从 HttpContext.User 对象查询声明并将相关声明传递给客户端。或者使用 Microsoft Graph API 直接从 Azure AD 获取用户的个人资料信息。

您可以使用 cookie 将 id token 存储在 OnAuthorizationCodeReceived 事件中,例如:

 context.Response.Cookies.Append("IDToken", context.ProtocolMessage.IdToken, new CookieOptions()
{
Path = "/",
HttpOnly = false,
Secure = true
});

并通过以下方式访问服务器端的值:

 var idToken= Request.Cookies["IDToken"];

但是你应该关注安全问题。当与 HttpOnly cookie 标志 (=true) 一起使用时,无法通过 JavaScript 访问,并且不受 XSS 攻击。您还可以设置安全 cookie 标志以保证 cookie 仅通过 HTTPS 发送。但是 cookie 容易受到跨站点请求伪造 (CSRF) 攻击。可以引用this thread其中提供了有关该问题的详细讨论。

简而言之,您可以将 ID token 存储在 cookie 中。但我建议从 HttpContext.User object 获取用户声明。

关于javascript - 使用 id_token 作为重定向 URL 中的参数的重定向用户导致身份用户为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53984185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com