我是一名长期的.NET Framework / WebForms开发人员,并且正在转向Core(2.1)以获得新项目。我已经有了基础部件,VS解决方案包含DAL项目和Web应用程序项目(在MVC中)。我正在使用Core Identity,并添加了默认的身份脚手架文件。一切都很好,Facebook注册/认证工作。到目前为止,我并不完全理解认证方案的工作原理,但我已经开始将它拼凑在一起了。
有一件事让我 - 以及我似乎无法找到任何清晰,直接的文档,是如何处理来自Facebook的索赔数据。我得到您要求的所有内容,在AddAuthentication()
方法的设置中,保存到客户端cookie,您可以通过这种方式检索它。但我想要做的是继续将这些信息保存到IdentityClaims
表。
在Startup.cs中,我设置了AddAuthentication()
这样的设置:
services.AddAuthentication().AddFacebook(options =>
{
options.AppId = "XXXXXXXXXX";
options.AppSecret = "XXXXXXXXXX";
options.SaveTokens = true;
options.Scope.Add("public_profile");
options.Scope.Add("email");
options.Fields.Add("name");
options.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
});
老实说,我并不完全知道我的设置是否正确,要求将“名称”声明包含在请求中...但即使是这样,我也要承认我真的不知道怎么处理它,后记。
我的猜测是,OnPostConfirmationAsync()
文件的ExternalLogin.cshtml.cs
方法必须在\ Identity \ Pages \ Account文件夹中发生。可能类似于:
UserManager.AddClaimAsync(user, ...something...);
但我真的不知道,似乎肯定有更好的方法。喜欢:有没有办法配置选项,以便调用UserManager.CreateAsync()方法自动存储声明?
这些都是非常基本的问题,我对自己因为无法清楚地看到它而感到沮丧。我所需要的只是一个很好的例子,我相信我会得到它。到目前为止,其他所有内容似乎都非常基本。
答案 0 :(得分:0)
感到惊讶的是,在发布这篇文章之后我发现了一个答案,我找到了自己问题的答案,以及它的真实性。
我会诚实地说,就外部提供商登录设置(在本例中为Facebook)而言,我并没有完全理解所有各种选项设置的情况。
事实证明,没有必要专门要求添加“名称”字段(它是“public_profile”范围的一部分)。将声明类型映射到该级别的更易读的名称也不一定有利。我认为只有当你试图让外部登录使用某种现有功能时才会有必要,这种功能需要特定的值,并且你无法在那里更改代码。
无论如何,如果您使用外部提供商,一旦获得回复,并且拥有SignInManager
和UserManager
的实例,您可以简单地:
var info = [SignInManager instance].GetExternalLoginInfoAsync();
[UserManager instance].AddClaimsAsync([IdentityUser instance], info.Principal.Claims);
这会将从外部提供商处获得的每一项索赔都扔到用户索赔表中。我碰巧做了一些比这更复杂的事情,其中包括循环索赔,以获得所需的。这很简单,一旦你意识到(我现在有)内置的System.Security.Claims.ClaimTypes
Type包含所有常见声明类型的完全限定模式名称的映射。所以只需要对你想要的那些进行排序,然后根据需要添加它们。简单。