![](/img/trans.png)
[英]In C# Web API - how do I get User and Pass from Python HTTPBasicAuth
[英]How do I get user email, name upon login in Web API C# backend?
我想在登录时获取用户的电子邮件和名称。 我注意到,如果创建自定义提供程序,则可以看到此信息
// 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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.