2017-07-03 69 views
0

我在使用Owin和Oauth2生成令牌时存在问题(在Mvc项目中)。 我的一些应用程序用户拥有子集用户,他们想在不知道密码的情况下登录到他们的面板。如何在Asp.Net中使用OAuth2生成令牌之前获取当前用户?

问题:

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当前用户。 有没有解决方法?

+0

子集用户是什么意思? –

+0

我的意思是一个用户是其他一些用户的父母。 – Mashtani

+0

但是只有父母用户有密码?父母用户是否需要登录子集用户? –

回答

1

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

看来你想模仿(子)用户。这是你可以做的。请注意,这是伪代码。阅读评论:

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. 
} 

这只是模仿孩子的想法。您需要添加正常登录的流程:其中子登录或父级未指定childUserName。

- update -

根据你的评论我更新了答案。

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

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

您还可以添加包含subsetUser的附加标头。在这种情况下,你不需要检查网址。

如果你想添加要求(一个或多个),我建议你使用ApplicationUser喜欢的模板:

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; 
    } 
} 

或者是这样的。我不知道如何以及在哪里坚持子集用户。

要获取可用子集的用户列表,假设子集的用户是从网址:

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

不能使用默认AuthorizeAttribute来验证这一点,但你可以添加自己的过滤器。

+0

家长用户登录并拥有持票人标记,然后他想要登录到儿童。我应该从这个标记中获取信息 – Mashtani

相关问题