gpt4 book ai didi

asp.net-mvc-5 - XsrfKey 的用途是什么?我应该将 XsrfId 设置为其他内容吗?

转载 作者:行者123 更新时间:2023-12-01 23:36:07 25 4
gpt4 key购买 nike

在我的 MVC 5 Web 应用程序中,我有这个(在 AccountController.cs 中):

    // Used for XSRF protection when adding external sign ins
private const string XsrfKey = "XsrfId";

        public string SocialAccountProvider { get; set; }
public string RedirectUri { get; set; }
public string UserId { get; set; }

public override void ExecuteResult(ControllerContext context)
{
var properties = new AuthenticationProperties { RedirectUri = RedirectUri };
if (UserId != null)
{
properties.Dictionary[XsrfKey] = UserId;
}

context.HttpContext.GetOwinContext().Authentication.Challenge(properties, SocialAccountProvider);
}

它到底是如何用于保护的?

我应该将 XsrfKey 的值设置为更随机的值吗?

最佳答案

看看ManageController方法LinkLoginLinkLoginCallback :

    //
// POST: /Manage/LinkLogin
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LinkLogin(string provider)
{
// Request a redirect to the external login provider to link a login for the current user
return new AccountController.ChallengeResult(provider, Url.Action("LinkLoginCallback", "Manage"), User.Identity.GetUserId());
}

//
// GET: /Manage/LinkLoginCallback
public async Task<ActionResult> LinkLoginCallback()
{
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());
if (loginInfo == null)
{
return RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
}
var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);
return result.Succeeded ? RedirectToAction("ManageLogins") : RedirectToAction("ManageLogins", new { Message = ManageMessageId.Error });
}

这些是处理外部帐户(即 Google、Facebook 等)链接的方法。流程如下:

  1. 用户点击“链接帐户”按钮,这将调用 POST 至 LinkLogin方法。
  2. LinkLogin返回ChallengeResult对象,回调 url 设置为 LinkLoginCallback方法。
  3. ChallengeResult.ExecuteResult由MVC框架调用,调用IAuthenticationManager.Challenge ,这会导致重定向到特定的外部登录提供程序(比方说:google)。
  4. 用户通过 Google 进行身份验证,然后 Google 重定向到回调网址。
  5. 回调由 LinkLoginCallback 处理。在这里,我们希望防止 XSRF 并验证调用是否由用户从我们的服务器(而不是某些恶意站点)提供的页面发起。

通常,如果它是一个简单的 GET-POST 序列,您将添加一个隐藏的 <input>字段与防伪标记并将其与相应的 cookie 值进行比较(这就是 Asp.Net Anti-Forgery Tokens 的工作原理)。

此处,请求来自外部身份验证提供商(在我们的示例中为 google)。因此,我们需要将防伪 token 提供给谷歌,谷歌应将其包含在回调请求中。这正是 state parameter OAuth2 的设计目的。

返回我们的XsrfKey :您输入的所有内容AuthenticationProperties.Dictionary将被连载并包含在state中OAuth2 请求的参数 - 以及 OAuth2 回调。现在,GetExternalLoginInfoAsync(this IAuthenticationManager manager, string xsrfKey, string expectedValue)将寻找 XsrfKey在收到的状态字典中并将其与 expectedValue 进行比较。它将返回 ExternalLoginInfo仅当值相等时。

所以,回答你原来的问题:你可以设置 XsrfKey任何你想要的,只要在设置和读取时使用相同的键即可。将其设置为任何随机值没有多大意义 - state参数已加密,因此没有人希望您能够读取它。

关于asp.net-mvc-5 - XsrfKey 的用途是什么?我应该将 XsrfId 设置为其他内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32121504/

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