如何在 Asp.Net 中使用OAuth2生成令牌之前获取当前用户?



我在使用 Owin 和 Oauth2 生成令牌时遇到问题(在 Mvc 项目中(。 我的一些应用程序用户有子集用户,他们想在不知道密码的情况下登录到他们的面板。

问题:

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{
public ApplicationOAuthProvider2(string publicClientId)
{
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
//get current user
var user1 = HttpContext.Current.User;//null
var user2 = Thread.CurrentPrincipal;//null
var user3 = context.OwinContext.Authentication.User;//null
}
}

我的OauthOptions:

OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
AllowInsecureHttp = true
};

我无法在OauthProvider中获取当前用户。 有什么解决办法吗?

当前用户在 GrantResourceOwnerCredentials中为 null 是合乎逻辑的。这就是您需要验证凭据,用户名/密码并在上下文中设置用户的地方。

您似乎要模拟(子(用户。这是你可以做的。请注意,这是伪代码。阅读评论:

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
// assume that context contains username, password and childusername
var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();            
//  First validate the credentials of the parent:
var appUser = await userManager.FindAsync(context.UserName, context.Password);
// Check if user is valid AND user is parent of childUserName
// now find the user to impersonate
appUser = await userManager.FindByNameAsync(context.ChildUserName);
// If found, appuser is child user:
// you may add information so you know that the user was impersonated by a parent user.
var propertyDictionary = new Dictionary<string, string> { { "userName", appUser.UserName }, { "parent", context.UserName } };
var properties = new AuthenticationProperties(propertyDictionary);
var oAuthIdentity = await appUser.GenerateUserIdentityAsync(userManager);
var ticket = new AuthenticationTicket(oAuthIdentity, properties);
// Token is validated.
context.Validated(ticket);
// parent is now child user.
}

这只是冒充孩子的想法。您需要为正常登录添加流程:其中子登录或父未指定子用户名。

--更新--

根据您的评论,我已经更新了答案。

access_token是独立的。您无法更改或更新它。因此,如果没有父用户再次登录,则无法切换当前子集用户。由于您无法使用当前access_token获得新的或其他access_token。

因此,有两种选择:使用上述流或向父用户添加声明。这不会设置当前用户,但您可以在 url 中添加当前子集用户。

您还可以添加包含子集用户的其他标头。在这种情况下,您无需检查网址。

如果要添加声明,我建议您使用像模板一样的应用程序用户:

public class ApplicationUser : IdentityUser
{
public List<string> SubsetUsers { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
userIdentity.AddClaim(new Claim("subsetUsers", string.Join(",", SubsetUsers)));
return userIdentity;
}
}

或类似的东西。我不知道您如何以及在哪里保留子集用户。

要获取可用子集用户的列表,假设子集用户来自 url:

user = (System.Security.Claims.ClaimsIdentity)User.Identity;
var subset = user.FindFirstValue("subsetUsers").Split(',');
if(subset.Contains(UserNameFromUrl))
IsValid = true;

不能使用默认的授权属性来验证这一点,但可以添加自己的筛选器。

相关内容

  • 没有找到相关文章

最新更新