我如何在Web API c#后端登录时获得用户电子邮件,名称

本文关键字:用户 电子邮件 名称 登录 后端 Web API | 更新日期: 2023-09-27 18:11:30

我想在登录时获得用户的电子邮件和名称。我注意到,如果我创建一个自定义提供程序,我可以看到这些信息

// WebApiConfig.cs
options.LoginProviders.Remove(typeof(GoogleLoginProvider));
options.LoginProviders.Add(typeof(CustomGoogleLoginProvider));

public class CustomGoogleLoginProvider : GoogleLoginProvider
{
    public CustomGoogleLoginProvider(HttpConfiguration config, IServiceTokenHandler tokenHandler)
        : base(config, tokenHandler)
    {
    }
    public override LoginResult CreateLoginResult(ClaimsIdentity claimsIdentity, string secretKey)
    {
        // name and email are on the ClaimsIdentity
        var result = base.CreateLoginResult(claimsIdentity, secretKey);
        return result;
    }
}

我可以看到我想要的索赔身份信息。但是如何在API方法中访问它们呢?如果我试图从用户那里得到索赔,它们是不一样的。这些归还给CreateLoginResult的索赔是否存储在某个地方?或者我可以把它储存起来以备以后使用?

我认为它可能存储在一个ExternalIdentity,是对的吗?我如何访问它?

我试着

var owin = HttpContext.Current.GetOwinContext();
var auth = owin.Authentication;
var user = auth.User;
var identity = auth.User.Identity;
var externalIdentity = auth.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

但是externalIdenity.Result返回null

我如何在Web API c#后端登录时获得用户电子邮件,名称

似乎我遇到的问题是因为我假设索赔是持久的。然而,REST服务似乎不保留任何类型的打开会话,因此来自一个会话的所有值将不会出现在其他请求中。

我要做的是存储信息从登录到数据库和访问时,我想通过用户id。

为了实现这一点,我可以使用Authenticated方法来获取我想要的所有外部值并将其保存到数据库中。

public class CustomGoogleLoginProvider : GoogleLoginProvider
{
    public CustomGoogleLoginProvider(HttpConfiguration config, IServiceTokenHandler tokenHandler)
        : base(config, tokenHandler)
    {
    }
    public override void ConfigureMiddleware(IAppBuilder appBuilder, ServiceSettingsDictionary settings)
    {
        var options = new GoogleOAuth2AuthenticationOptions
        {
            ClientId = settings["MS_GoogleClientID"],
            ClientSecret = settings["MS_GoogleClientSecret"],
            AuthenticationType = this.Name,
            Provider = new CustomGoogleLoginAuthenticationProvider()
        };
        appBuilder.UseGoogleAuthentication(options);
    }
}
public class CustomGoogleLoginAuthenticationProvider : GoogleLoginAuthenticationProvider
{
    public override Task Authenticated(GoogleOAuth2AuthenticatedContext context)
    {
        var result = base.Authenticated(context);
        var owin = HttpContext.Current.GetOwinContext();
        var auth = owin.Authentication;
        var identity = auth.User.Identity as ClaimsIdentity;
        //
        // store things I want in the database
        //
        return result;
    }
}