在使用ASP.NET Identity 2进行身份验证时,如何获取返回的User对象?

时间:2016-12-03 12:30:45

标签: c# asp.net asp.net-web-api asp.net-web-api2 asp.net-identity

此身份验证通常只涉及使用用户凭据调用“/ Token”端点,并接收包含用户的身份验证令牌的故障单。我在我的Web API中从WPF客户端应用程序调用它,如果我可以简单地使用一个返回经过身份验证的IdentityUser的身份验证请求,它将使我的生活变得更轻松,登录过程更快。在基于普通模板的API项目中,AspNetUser对象。

我看到我的API TokenEndPoint中的方法ApplicationOAuthProvider做的很少,所以我认为那里的改变不会有太大帮助,但GrantResourceOwnerCredentials似乎是关键所在该提供商,但其回报无效。

提供商的选项包括:

AuthorizeEndpointPath = new PathString(“/ api / Account / ExternalLogin”)

但我找不到该行动被执行的证据。我将所有成功的请求跟踪到日志,并且我的Debug.WriteLine($"API TRACE: ExternalLogin called for {provider}.")没有出现在输出窗口中,所以我认为我不能使用该操作将服务器重定向到返回用户的那个。

除了从允许匿名的登录操作调用/Token端点,然后重定向之外,我能做些什么吗?

编辑:授予令牌的方法位于我的项目模板中提供的ApplicationOAuthProvider类中。它来自OAuthAuthorizationServerProvider。它是:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var userManager = context.OwinContext.GetUserManager<UserManager>();
    var user = await userManager.FindAsync(context.UserName, context.Password);
    if (user == null)
    {
        context.SetError("invalid_grant", $"The user name or password is incorrect.");
        return;
    }
    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
        OAuthDefaults.AuthenticationType);
    ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
        CookieAuthenticationDefaults.AuthenticationType);
    AuthenticationProperties properties = CreateProperties(user.UserName);
    AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
    context.Validated(ticket);
    context.Request.Context.Authentication.SignIn(cookiesIdentity);
}

1 个答案:

答案 0 :(得分:0)

可以在Server.Transfer类的GrantResourceOwnerCredentials方法中执行ApplicationOAuthProvider : OAuthAuthorizationServerProvider。这是在项目模板或Nuget包中开箱即用的。

转移将是Login中添加的AccountController方法,其中包含用户名,密码和其他ticket参数,该参数将返回AspNetUser个用户类,您可以为GrantResourceOwnerCredentials中获取的身份验证票证添加额外属性,并且通常由/Token资源返回。

但这太过于干涉我不写的代码了,所以对于这个项目的紧急原型,我只需要调用/Token,当我有用户名时,我会调用/User来获取现在已登录AspNetUser