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來驗證這一點,但你可以添加自己的過濾器。
子集用戶是什麼意思? –
我的意思是一個用戶是其他一些用戶的父母。 – Mashtani
但是隻有父母用戶有密碼?父母用戶是否需要登錄子集用戶? –