asp.net-mvc-5 – 什么是XsrfKey用于,我应该将XsrfId设置为其他
在我的MVC 5网络应用程序我有(在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方法LinkLogin和LinkLoginCallback:
// // 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等)的链接的方法.流程如下: >用户单击“链接帐户”按钮,该按钮调用POST到LinkLogin方法. 通常,如果它是一个简单的GET-POST序列,您将添加一个隐藏的< input>字段与防伪令牌,并将其与相应的cookie值进行比较(这就是Asp.Net Anti-Forgery Tokens的工作原理). 在这里,请求来自外部验证提供商(在我们的示例中为Google).所以我们需要把反伪造币给google,google应该把它放在回调请求中.这正是OAuth2设计的state parameter. 返回到我们的XsrfKey:将所有您在AuthenticationProperties.Dictionary中放置的内容都将被序列化并包含在OAuth2请求的状态参数中,从而导致OAuth2回调.现在,GetExternalLoginInfoAsync(此IAuthenticationManager管理器,字符串xsrfKey,string expectedValue)将在接收状态字典中查找XsrfKey并将其与expectedValue进行比较.只有当值相等时,它才会返回ExternalLoginInfo. 所以,回答你原来的问题:你可以设置XsrfKey到任何你想要的,只要在设置和阅读时使用相同的键.将它设置为随机的任何东西都没有什么意义 – 状态参数是加密的,所以没有人会希望你能够阅读它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – ASP.NET MVC多站点SSO使用OpenID
- asp.net-mvc – ASP.NET MVC 4 Web Api和REST经典服务之间的
- asp.net – 实体框架与存储过程
- asp.net – Model-View-Presenter,View的界面属于哪里?
- ASP.NET MVC 3使用子集合进行不显眼的jQuery客户端验证
- asp.net-mvc – ASP.NET MVC 5自定义错误页面
- asp.net – Windows Azure缓存预览
- asp.net mvc.显示数据库中的html字符串
- ASP.Net上传文件
- asp.net-mvc – DotNetOpenAuth简单演示,MVC和Razor
- asp.net-mvc – TempData keep()vs peek()
- asp.net – 在IIS URL Rewrite 2中重新处理重写的
- Ninject,ASP.NET和自定义控件
- asp.net – 错误:此程序集是由运行时比当前加载
- asp.net-mvc – 加载符号时Visual Studio调试痛苦
- asp.net-mvc – asp.net MVC DisplayTemplates和
- asp.net – 最佳实践:DataBound with loop vs R
- 缓存asp.net c#的数据列表
- asp.net-2.0 – 如何解决ASP.NET“?”应用程序路
- asp.net – DNN外观可以使用空白元素而不是div来