我如何在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
似乎我遇到的问题是因为我假设索赔是持久的。然而,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;
}
}