ASP.NET Identity:授权后更新外部声明

2024-01-27

我将 ASP.NET Identity 与多个外部登录提供程序一起使用,并且需要处理以下场景:

1) 用户使用外部服务登录(假设是 Facebook), 应用程序从 Facebook 获取一些信息(名字和姓氏、电子邮件、出生日期等...)包含此信息的声明将添加到身份中。

2)我需要将此信息存储在应用程序数据库中,用于以下场景:

  • 管理员浏览注册用户列表

  • 电子邮件订阅服务将使用名字和姓氏

  • ...

问题是,如果用户更新他/她的 Facebook 个人资料(例如,更改电子邮件地址)怎么办?在这种情况下,我也需要更新我的数据库中的信息(我将外部声明存储在 AspNetUserClaims 表中)。实际上,每次外部用户经过身份验证时我都需要更新它。

这是第一次保存的代码:

扩展索赔类别:

public class ApplicationUserClaim : IdentityUserClaim<Guid>
{
    public string Issuer { get; set; }
    public string ClaimValueType { get; set; }
}

Startup:

var facebookOptions = new FacebookAuthenticationOptions {
    AppId = "...",
    AppSecret = "...",
    Provider = new FacebookAuthenticationProvider {
        OnAuthenticated = (context) => {
            context.Identity.AddClaims(new[] {
                new Claim("LastName", context.User["last_name"].ToString(), ClaimValueTypes.String, "Facebook"),
                new Claim("FirstName", context.User["first_name"].ToString(), ClaimValueTypes.String, "Facebook"),
                //...Other claims
            });
        }
    }
};

facebookOptions.Scope.Add("email");
facebookOptions.Scope.Add("user_birthday");

app.UseFacebookAuthentication(facebookOptions);

认证控制器

外部登录回调:

public ActionResult ExternalLogin(string returnUrl)
{
    var loginInfo = authenticationManager.GetExternalLoginInfo();

    //No user found - this is the first login with an external service
    //Asking to confirm an external account
    if(signInStatus == SignInStatus.Failure)
        return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { ... });    
}

外部登录确认后创建用户(省略其他代码):

public ActionResult ExternalLoginConfirmation(ExternalLoginConfirmationViewModel loginConfirmationViewModel)
{
    var loginInfo = authenticationManager.GetExternalLoginInfo();

    var user = new ApplicationUser();

    user.Logins.Add(new RegisteredUserLogin {
        LoginProvider = loginInfo.Login.LoginProvider,
        ProviderKey = loginInfo.Login.ProviderKey
    });

    //Converting Claims added in OnAuthenticated callback to ApplicationClaim objects to store them in Db
    foreach(var userInfoClaim in loginInfo.GetUserInfoClaims())                        
        user.Claims.Add(ClaimsHelper.ToUserClaimObject(userInfoClaim));

    userManager.Create(user);
}

这工作正常,但在 Facebook 用户回来后我不得不更新传入的声明值。处理这种情况的真正方法是什么? 谢谢。


这是有点昂贵但最简单的答案:

您只需在用户登录时检查相同的信息即可,如果发生更改则更新它们。由于您与 Facebook 没有直接连接,因此您永远无法知道用户何时更改其信息。

除非您在一分钟内有数千次登录系统,否则这应该是一种不错的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Identity:授权后更新外部声明 的相关文章

  • 访问 Asp.Net Core 应用程序中的 Web.config 设置?

    据我所知 asp net core 有一个新的配置系统 非常灵活 非常棒 但我喜欢 net 4 x 中基于 web config 的配置系统 例如 可以在 web config 文件中添加注释 因为它是一个 xml 文件 对我来说 值得坚持
  • 如何逐行解析文本区域中的用户输入

    如果我有一个包含文本信息的变量 比如从文本区域获取 如何逐行读取字符串变量中保存的文本内容 在文本区域中输入的文本将以 n 输入键 来分隔行 您可以使用StringReader http msdn microsoft com en us l
  • 检查Cookie是否存在

    从快速搜索开始堆栈溢出我看到有人建议使用以下方法来检查 cookie 是否存在 HttpContext Current Response Cookies cookie name null 或 在一个Page class this Respo
  • mvc 2中的图像上传和预览

    我正在通过转换 asp net 网站来学习 mvc 2 在我的页面中 我必须上传图像并显示图像的预览 下面给出了我的 asp net 页面的屏幕截图 我将模型创建为 public class Contest public int conte
  • ASP.Net 控件的 InnerHTML 和 InnerText 属性之间的区别?

    例如 在使用 ASP NET 控件时 h1 text h1 如果我们想更改标题的文本 我们可以通过两个属性来完成InnerHTML and InnerText 我想知道这两个属性之间的基本区别是什么 InnerHtml让您直接输入 HTML
  • 路径访问被拒绝 VS 2017 无法复制文件

    最近 Visual Studio 遇到了最奇怪的问题 我正在运行 2017 年 我有一个与同事合作了一段时间的存储库 有一天我突然尝试构建 但遇到了一些错误 内容如下 访问路径 function json 被拒绝 然后 在多次尝试构建和清理
  • jquery ajax可以调用外部webservice吗?

    jquery ajax代码可以调用吗网络服务来自另一个域名或另一个网站 像这样 ajax type POST url http AnotherWebSite com WebService asmx HelloWorld data name
  • 错误:“无法在 Web 服务器上开始调试...”ASP.NET 4.0

    当我想在 IIS 服务器上创建网站时出现错误 我使用的是 Windows 7 和 Visual Studio 2010 我是否必须为 IIS 注册或配置 asp net 4 0 这里没有太多细节 但是当我尝试在刚刚从 3 5 更改为 4 0
  • 从表单身份验证中排除页面 - ASP.NET

    我知道有两种方法可以从表单验证中排除页面 通过使用包含需要排除的页面的文件夹中的另一个 web config 文件 或者使用 location 元素
  • Page_ClientValidate 未定义

    我正在使用 ASP NET 2 0 并使用 IE8 作为我的默认浏览器 但无论我尝试多少次 Page ClientValidate一直给我这个错误 它没有定义 我怎么解决这个问题 请帮忙 所以 我想你的页面中可能没有任何RequiredVa
  • 当用户告诉浏览器“刷新”时,是否应该填写 HTTP_REFERER?

    我正在尝试使用引用标头检查作为深度防御 即多种安全技术之一 但请注意仅依赖于任何一种技术 有时 MSIE 似乎不包含刷新时的引荐来源网址 这是预期的行为吗 无论如何 我是否可以检测刷新 以便我知道缺少引荐来源网址是可以的 是的 我知道引荐来
  • 如何在 Web 表单中进行 Html.Encode

    我有一个 ASP NET Web 窗体应用程序 有一个带有文本框的页面 用户在其中输入搜索词用于查询数据库 我知道我需要防止 JavaScript 注入攻击 我该怎么做呢 在 MVC 中我会使用Html Encode Web 表单中似乎无法
  • 有没有办法使用 ASP.NET 在用户离开页面时始终运行某些服务器端代码?

    我想知道当用户离开 ASP NET 中的页面时是否有任何方法可以始终运行一些服务器端代码 页面卸载事件不好 因为如果有人单击链接 则不会调用该事件 理想情况下 即使用户关闭浏览器 我也希望代码能够运行 我怀疑我所问的问题是不可能的 但问一下
  • 如何终止会话或会话 ID (ASP.NET/C#)

    当用户单击注销按钮时 如何销毁会话 会话 名称 我正在 MSDN 上查看 ASP NET API Reference 它似乎没有太多信息 看来还是比较有限的 但我找不到 ASP NET 类等的任何其他页面 我努力了 Session Aban
  • 家庭自动化图书馆[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是一名 C 开发人员 希望将家庭自动化作为一种 爱好 我做了一些研究 但想知道是否有人知道支持 In
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 控件更改时 ObjectDataSource 创建两次

    我将 ObjectDataSource 与 GridView 一起使用 并在代码隐藏中使用 OnObjectCreated 处理程序 如果我以编程方式更改 GridView 上的子控件值 则整个控件会在同一请求中再次进行数据绑定 如 OnO
  • jQuery Datatable:分页和过滤器显示不正确

    我不知道如何解决这个问题 尝试了一整天但没有成功修复分页 我正在使用 jQuery 数据表 并且为了显示我的大量数据 我正在使用服务器端 作为测试 仅调用表中的 10 行数据 然后在传递到表之前 我重组了里面的数据dataSrc 使用这个解
  • 优化视图状态

    是否有人对优化 ASP NET 应用程序的视图状态有任何想法或参考可以向我指出 我不想把它全部关闭 优化它的主要目标是提高性能 所以我不想运行一个昂贵的函数来递归地禁用某些控件的视图状态 因为该函数会减慢速度页面的加载时间会达不到目的 有任
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a

随机推荐

  • 使用 switch 语句可以解决的最大情况数

    这是出于好奇 单个开关盒最多可以有多少个switch包括default 案件 我的意思是这样的 switch ch case 1 some statement break case 2 some statement break case n
  • ubuntu 中的单声道和非托管代码

    我使用的是单声道 2 10 在 Ubuntu 12 x64 上运行 现在我需要知道如何使用非托管代码 DllImport libc so public static extern int getpid 并且 在下一步中我有 getpid 我
  • 部署qt mysql应用程序

    我开发了一个使用 Qt MySQL 的应用程序 connection QSqlDatabase addDatabase QMYSQL 我已经成功编译了 mysql 驱动程序 我的应用程序可以运行 一切都很好 现在我正在尝试部署我的应用程序
  • Eclipse+Pydev 中转到定义的[快捷方式/其他方式]是什么

    我以前用过WingIde 其中我经常使用的快捷方式 f4 默认 是 Goto 定义 它将打开定义文件 并将我带到它 eclipse pydev 有类似的快捷方式吗 For Aptana Pydev you have Go To Defini
  • R / RStudio:高 dpi 屏幕上的图形缩放问题和模糊性

    在高 DPI 4K 显示器上 Windows 下的 RStudio 绘图窗口似乎使用像素加倍来使绘图清晰 我使用的是 RStudio 0 99 483 和 R 3 2 2 以及 Windows 8 1 但在 Windows 10 下结果相同
  • AWS Sagemaker 自定义用户算法:如何利用额外实例

    这是一个基本的 AWS Sagemaker 问题 当我使用 Sagemaker 的内置算法之一进行训练时 通过增加训练算法的 instance count 参数 我能够利用将作业分配到许多实例所带来的巨大加速 然而 当我打包自己的自定义算法
  • BGL 添加具有多个属性的边

    我希望所有边缘都具有属性 重量和容量 我发现 BGL 已经定义了这两个 所以我为图定义了边和顶点属性 typedef property
  • AngularJS 锚点点击第二次不起作用

    这是我的Demo http plnkr co edit GArzH9gTQCd0r53WhuWO p preview app run function rootScope location anchorScroll when the rou
  • Google Analytics 自定义变量不起作用

    我想在 Google Analytics 中设置用户详细信息 我使用以下语法 但无法捕获登录应用程序的用户的使用情况 ga set employeetype permanent ga set employeetype vendor ga s
  • (目标 C)在没有撰写屏幕的情况下打开默认的 Apple Mail 应用程序、Yahoo Mail 或 Safari?

    我有一个按钮 当点击它时 它会让我们在默认邮件应用程序 雅虎邮件和 Safari 之间进行选择来阅读收件箱 目前我正在使用 NSURL mailURL NSURL URLWithString mailto email protected c
  • Silverlight 4 拖放替代方案

    我想添加将用户控件从 Silverlight 4 页面的一个部分拖动到同一页面上的另一个用户控件的功能 不是谈论将文件从操作系统拖动到页面上的新 Silverlight 4 功能 什么方法最直接 哪种方法提供最大的灵活性 这是我迄今为止发现
  • sql 查询计算总和并添加前几行的总和

    这是我的T1桌 dat dt credit debit 22 02 2019 10 5 25 02 2019 30 60 10 03 2019 50 40 13 03 2019 100 10 我想生成以下输出 max date cr sum
  • 有什么方法可以获取 C# 中调用对象的引用吗?

    我想知道是否可以 例如 遍历堆栈帧 检查每个调用对象以查看是否与接口匹配 如果是 则从中提取一些数据 是的 我知道这是不好的做法 我想知道这是否可能 不 不存在 至少不使用某种描述的分析 调试 API 就不会 您可以遍历堆栈来查找调用met
  • $onloaded 为新引用触发一次 AngularFire 0.5.0

    假设我们正在使用推送状态导航路线 locationProvider html5Mode true 有两条路线有两个不同的控制器 stateProvider state one url one templateUrl one html con
  • 以编程方式更改 R.string 的值?

    我正在寻找一种动态更改字符串资源值的方法 我尝试使用反射 但它声称 字段值无效 我在布局中使用字符串作为值 但需要将它们交换为不同的语言 请参阅下面所附的代码 public class Lang public static void lan
  • 执行一些代码,然后进入交互节点

    有没有办法在进入 Node js 中的交互模式之前执行一些代码 在文件中或从字符串中 并不重要 例如 如果我创建一个脚本 preamble js其中包含 console log preamble executed poor guy 和用户类
  • 使用 gradle 对嵌入 glassfish 的 jar 进行容器测试失败

    我正在使用 JUnit 和嵌入式 glassfish 来使用 CDI 测试一些代码 这看起来相当简单 但我一定错过了一些东西 我创建了一个简单的项目来演示该问题 https github com dantwinkler container
  • 如何在用户离开页面时删除文件?

    我有一个表单 其操作设置为 php 文件 verify php 在表单中 我制作了一个非常漂亮的图片上传部分 提交表单后 将打开 verify php 以验证用户填写的表单 表单值全部放置在 verify php 页面上的另一个表单内 仅将
  • Xamarin.Forms 和 Xamarin 跨平台之间的区别

    我已经使用 Xamarin 环境 2 年了 主要使用 Xamarin Forms 但是 我不知道 Xamarin 跨平台是什么 谁能提供一些结构差异 当我们谈论 Xamarin 时 本机应用程序的开发有两种方法 传统的 Xamarin 方法
  • ASP.NET Identity:授权后更新外部声明

    我将 ASP NET Identity 与多个外部登录提供程序一起使用 并且需要处理以下场景 1 用户使用外部服务登录 假设是 Facebook 应用程序从 Facebook 获取一些信息 名字和姓氏 电子邮件 出生日期等 包含此信息的声明