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

相關問題