Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 将ClaimsPrincipal从控制器传递到服务_.net Core_Clean Architecture - Fatal编程技术网

.net core 将ClaimsPrincipal从控制器传递到服务

.net core 将ClaimsPrincipal从控制器传递到服务,.net-core,clean-architecture,.net Core,Clean Architecture,我对.NETCore还比较陌生,但我正试图尽可能遵循可靠的原则来编写代码 我有一个场景,在我的网站上注册的用户可能会决定使用使用相同电子邮件的Facebook帐户登录;这会引发错误,因为“我的用户”表中的电子邮件字段是唯一的 我的解决方案是创建一些类似Facebook的关联表用户 在我注册用户的控制器中;为了获得用户ID,我已经实现了一个服务(a.检查现有用户的user_facebook表或(B.根据电子邮件将facebook用户ID与现有用户关联) [路由(“api/用户”)] [HttpP

我对.NETCore还比较陌生,但我正试图尽可能遵循可靠的原则来编写代码

我有一个场景,在我的网站上注册的用户可能会决定使用使用相同电子邮件的Facebook帐户登录;这会引发错误,因为“我的用户”表中的电子邮件字段是唯一的

我的解决方案是创建一些类似Facebook的关联表用户

在我注册用户的控制器中;为了获得用户ID,我已经实现了一个服务(a.检查现有用户的user_facebook表或(B.根据电子邮件将facebook用户ID与现有用户关联)

[路由(“api/用户”)]
[HttpPost]
公共异步任务注册器()
{
var userId=await userService.GetUserIdAsync(用户);
var email=User.Claims.First(e=>e.Type==“emails”).Value;
var user=await\u unitOfWork.Users.GetUserByIdAsync(userId);
//检查联系人,查看是否需要与用户关联
var contact=wait_unitOfWork.Contacts.GetContactByEmail(电子邮件);
...
服务代码段:

公共异步任务GetUserIdAsync(ClaimsPrincipal authedUser)
{
var userId=authedUser.Claims.First(e=>e.Type==)http://schemas.microsoft.com/identity/claims/objectidentifier1.价值;
var email=authedUser.Claims.First(e=>e.Type==“emails”).Value;
var identityProvider=authedUser.HasClaim(e=>e.Type==”http://schemas.microsoft.com/identity/claims/identityprovider") ?
authedUser.Claims.First(e=>e.Type==”http://schemas.microsoft.com/identity/claims/identityprovider)。值:空;
...
我的问题是,这有什么问题吗?我将ClaimsPrincipal传递给我的服务可以吗?或者我打破了某种最佳做法吗?如果我完全放弃了,有人能建议一种更好的方法来做这样的事情吗


提前感谢

我个人,我不会将ClaimsPrincipal传递到方法中。而是将IHttpContextAccessor传递到服务的构造函数中。这样,可以通过执行以下操作将其注册到DI容器中:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddHttpContextAccessor();
}
然后在服务类中注入
IHttpContextAccessor
,如下所示:

public class MyClass(IHttpContextAccessor context)
{
}
这意味着您可以从类中访问当前上下文,而无需通过方法将其传入

要访问当前登录用户,只需按如下方式访问:

public class MyClass(IHttpContextAccessor context)
{
}

var username=Context.User.Identity.Name;

这让我达到了我想要的目的;但是我注意到我必须执行以下操作才能正常工作…Context.HttpContext.User.Claims.First(e=>e.Type==“”)。Value;无论如何,谢谢。