C# 在ASP.NET MVC中连接OAuth与用户或个人模型#

C# 在ASP.NET MVC中连接OAuth与用户或个人模型#,c#,asp.net-mvc,google-oauth,C#,Asp.net Mvc,Google Oauth,因此,网上有很多关于如何让oAuth使用ASP.NET的教程,甚至有一个关于如何为使用MVC登录的帐户设置角色的教程,但这些教程都没有解释下一步的内容。当你将你在谷歌注册的用户连接到你应用程序中的个人或用户模型时,这叫什么?你是如何根据你和谷歌一样登录的人来扮演这些人的角色的?我已经知道了如何注册名字和姓氏以及所有的爵士乐,但我仍然不知道如何注册,这样我就可以加入或扮演这个角色 例如,我有一个person模型和一些从person模型继承的其他模型,例如Engineer和Manager: publ

因此,网上有很多关于如何让oAuth使用ASP.NET的教程,甚至有一个关于如何为使用MVC登录的帐户设置角色的教程,但这些教程都没有解释下一步的内容。当你将你在谷歌注册的用户连接到你应用程序中的个人或用户模型时,这叫什么?你是如何根据你和谷歌一样登录的人来扮演这些人的角色的?我已经知道了如何注册名字和姓氏以及所有的爵士乐,但我仍然不知道如何注册,这样我就可以加入或扮演这个角色

例如,我有一个person模型和一些从person模型继承的其他模型,例如Engineer和Manager:

public class Person
    {
        [Key]
        public int PersonId { get; set; }

        [Required(ErrorMessage = "The First Name field is required.")]
        [Display(Name = "First Name")]
        [MaxLength(50)]
        public string FirstName { get; set; }

        [Required(ErrorMessage = "The Last Name field is required.")]
        [Display(Name = "Last Name")]
        [MaxLength(50)]
        public string LastName { get; set; }

        [NotMapped]
        [Display(Name = "Name")]
        public string FullName
        {
            get
            {
                return FirstName + " " + LastName;
            }
        }

    }

public class Engineer : Person
    {
        public ICollection<Manager> managers { get; set; }
    }

public class Manager : Person
    {
        public ICollection<Engineer> engineers { get; set; }
    }
那么,我如何登录谷歌,然后成为其中一员呢?这叫什么?这样做有名字吗?我想每个人都会在某个时候这样做。我可以在初始化类中创建人员、经理和工程师,但我不知道如何使用oAuth

注意,我更愿意强制所有用户登录谷歌,而不是创建一个本地用户帐户,这样我就不用费心注册网站帐户了

另外,为了更好地衡量,这里是我的IdentityModel:

public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Add custom user claims here
            return userIdentity;
        }
    }
公共类应用程序用户:IdentityUser
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共异步任务GenerateUserIdentityAsync(用户管理器)
{
//注意authenticationType必须与CookieAuthenticationOptions.authenticationType中定义的类型匹配
var userIdentity=wait manager.CreateIdentityAsync(这是DefaultAuthenticationTypes.ApplicationOkie);
//在此处添加自定义用户声明
返回用户身份;
}
}

在外部登录过程中,授权令牌由第三方API返回。您应该添加此令牌作为用户的声明。您可以通过将
Startup.Auth.cs
中的代码更改为以下内容来完成此操作:

var googleOptions = new GoogleOAuth2AuthenticationOptions
{
    ClientId = Properties.Settings.Default.GoogleClientId,
    ClientSecret = Properties.Settings.Default.GoogleClientSecret,
    Provider = new GoogleOAuth2AuthenticationProvider
    {
        OnAuthenticated = (context) =>
        {
            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:google:access_token", context.AccessToken, XmlSchemaString, "Google"));
            return Task.FromResult(0);
        }
    }
};
googleOptions.Scope.Add("foo");
app.UseGoogleAuthentication(googleOptions);
在上面的“foo”中,您需要添加需要用户授权应用程序的范围。有关详细信息,请参阅谷歌API文档。如果需要多个作用域,请添加其他
googleOptions.Scope.add

稍后,您可以使用以下方法检索令牌:

var googleTokenClaim = user.Claims.FirstOrDefault(m => m.ClaimType.EndsWith("google:access_token"));
就谷歌的API而言,返回的令牌是“刷新令牌”。在用户撤销对你的应用程序的访问之前,刷新令牌是有效的,但你需要“以旧换新”获取访问令牌。有关如何执行此操作的详细信息,可以在中找到,也可以使用其中一个客户端库为您处理所有这些

长和短,一旦您有了真正的访问令牌,您只需通过向请求添加
authorization:Bearer[token]
头来授权需要授权的请求

现在,不同的API处理这些问题的方式有所不同,但您特别提到了谷歌。请查阅您可能需要使用的其他API的文档,看看您应该如何处理这些API

更新:获取用户实例

对于Identity,
user.Identity
公开的用户主体不是数据库中用户实例的完整表示。为了获得用户的所有信息,包括他们的声明,您需要从数据库中查询用户。首先,您需要获取用户的id,这样您就有了一些查询依据。Identity在
User.Identity
上公开扩展名
GetUserId()

var userId = User.Identity.GetUserId();
如果您已自定义了
IdentityUser
的主键,则需要改用通用版本:

var userId = User.Identity.GetUserId<int>();
但是,您最常使用的是
UserManager
实例,因为它本质上包装了您的上下文,并提供了其他有用的功能:

var user = UserManager.FindById(userId);

这是基于默认实现的
AccountController
,当您使用个人身份验证构建项目时。默认情况下,
AccountController
上的
UserManager
属性是
UserManager
的一个实例,或者如果您自定义了主键,例如
UserManager
,其中
int
将是主键的类型。如果您在另一个控制器中执行此操作,或者只是不使用搭建版的
AccountController
,那么您只需要类似地定义
UserManager

的一个实例,您是在谈论社交登录吗?我是在谈论谷歌oauth。将oauth数据添加到user或person类。我再次更新了我的帖子,提供了更多详细信息。在调用-wait-SignInManager.ExternalSignInAsync期间,您的外部访问令牌用于生成本地访问令牌。你是想问关于模拟的问题吗?我想知道的主要是如何使用oAuth在系统中创建帐户,并允许该帐户的管理员或所有者管理其详细信息,以及让这些用户扮演不同的角色。当他们点击注册按钮时,我希望它创建一个人。我在谷歌上搜索了很多关于这方面的教程,但似乎找不到。我可以在Google oAuth上找到一些关于登录的教程,一些关于从用户或Google帐户收集信息的提示,但仅此而已。我的个人模型在这一切中起到了什么作用呢?实际上没有,或者最好说你想让它去哪里就去哪里。也许我不完全理解您的问题,但是没有好的方法将外部登录绑定到非
IdentityUser
对象。实际上,如果您想将登录名绑定到
Person
,那么
Person
应该从
ApplicationUser
继承。让我尝试从ApplicationUser继承Person模型,因为这是迄今为止唯一有意义的方法。是的,没有什么好方法可以将外部登录绑定到非身份用户,但我确实不知道有什么方法可以绑定
var userId = User.Identity.GetUserId<int>();
var user = db.Users.Find(userId);
var user = UserManager.FindById(userId);