此身份验证通常只涉及使用用户凭据调用“/ 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);
}
答案 0 :(得分:0)
可以在Server.Transfer
类的GrantResourceOwnerCredentials
方法中执行ApplicationOAuthProvider : OAuthAuthorizationServerProvider
。这是在项目模板或Nuget包中开箱即用的。
转移将是Login
中添加的AccountController
方法,其中包含用户名,密码和其他ticket
参数,该参数将返回AspNetUser
个用户类,您可以为GrantResourceOwnerCredentials
中获取的身份验证票证添加额外属性,并且通常由/Token
资源返回。
但这太过于干涉我不写的代码了,所以对于这个项目的紧急原型,我只需要调用/Token
,当我有用户名时,我会调用/User
来获取现在已登录AspNetUser
。