繁体   English   中英

如何在Web API C#后端登录时获取用户电子邮件和名称?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM