强制另一个用户使用 ASP.NET Identity 2.1.0 刷新他们的声明
Force another user to refresh their Claims with ASP.NET Identity 2.1.0
我正在使用 Asp.NET Identity 2.1.0
并且我存储了 User
可以访问的 Accounts
的列表,作为声明。当User
登录时生成ClaimsIdentity
:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add Claims concerning Account
userIdentity.AddClaim(new Claim("AccountList", SerializedListOfAccounts));
return userIdentity;
}
假设管理员撤销了 User A
对特定帐户的访问权限。我怎样才能强制 User A
重新生成它的 ClaimsIdentity
?请记住,它不在 User A
的上下文中。而且我不想等到 cookie 过期(并自动生成一个新的 ClaimsIdentity
。
可能吗?有没有办法告诉服务器将 User A
的 cookie 视为无效并强制重新生成它?
我想要这种行为的原因是创建一个自定义 AuthorizeAttribute
,我可以将其放在我的控制器上,检查 Claims
以查看 User
是否具有访问权限,以避免额外的数据库往返。
您不能将它们的声明存储在 cookie 上,而是将它们应用于管道早期对身份的每个请求。您必须破解 Startup.Auth.cs
才能做到这一点。我正在这样做 here。
这是您可以使用的要点:
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
Provider = GetMyCookieAuthenticationProvider(),
// other configurations
});
// other usual code
}
private static CookieAuthenticationProvider GetMyCookieAuthenticationProvider()
{
var cookieAuthenticationProvider = new CookieAuthenticationProvider();
cookieAuthenticationProvider.OnValidateIdentity = async context =>
{
// execute default cookie validation function
var cookieValidatorFunc = SecurityStampValidator.OnValidateIdentity<UserManager, ApplicationUser>(
TimeSpan.FromMinutes(10),
(manager, user) =>
{
var identity = manager.GenerateUserIdentityAsync(user);
return identity;
});
await cookieValidatorFunc.Invoke(context);
// sanity checks
if (context.Identity == null || !context.Identity.IsAuthenticated)
{
return;
}
// get your claim from your DB or other source
context.Identity.AddClaims(newClaim);
};
return cookieAuthenticationProvider;
}
}
您需要对每个请求应用声明的缺点,这可能不是很高效。但是在正确的位置进行适量的缓存会有所帮助。此外,这段代码并不是最容易工作的地方,因为它处于管道的早期阶段,您需要自己管理 DbContext
和其他依赖项。
优点是声明会立即应用于每个用户的请求,您无需重新登录即可立即更改权限。
我正在使用 Asp.NET Identity 2.1.0
并且我存储了 User
可以访问的 Accounts
的列表,作为声明。当User
登录时生成ClaimsIdentity
:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add Claims concerning Account
userIdentity.AddClaim(new Claim("AccountList", SerializedListOfAccounts));
return userIdentity;
}
假设管理员撤销了 User A
对特定帐户的访问权限。我怎样才能强制 User A
重新生成它的 ClaimsIdentity
?请记住,它不在 User A
的上下文中。而且我不想等到 cookie 过期(并自动生成一个新的 ClaimsIdentity
。
可能吗?有没有办法告诉服务器将 User A
的 cookie 视为无效并强制重新生成它?
我想要这种行为的原因是创建一个自定义 AuthorizeAttribute
,我可以将其放在我的控制器上,检查 Claims
以查看 User
是否具有访问权限,以避免额外的数据库往返。
您不能将它们的声明存储在 cookie 上,而是将它们应用于管道早期对身份的每个请求。您必须破解 Startup.Auth.cs
才能做到这一点。我正在这样做 here。
这是您可以使用的要点:
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
Provider = GetMyCookieAuthenticationProvider(),
// other configurations
});
// other usual code
}
private static CookieAuthenticationProvider GetMyCookieAuthenticationProvider()
{
var cookieAuthenticationProvider = new CookieAuthenticationProvider();
cookieAuthenticationProvider.OnValidateIdentity = async context =>
{
// execute default cookie validation function
var cookieValidatorFunc = SecurityStampValidator.OnValidateIdentity<UserManager, ApplicationUser>(
TimeSpan.FromMinutes(10),
(manager, user) =>
{
var identity = manager.GenerateUserIdentityAsync(user);
return identity;
});
await cookieValidatorFunc.Invoke(context);
// sanity checks
if (context.Identity == null || !context.Identity.IsAuthenticated)
{
return;
}
// get your claim from your DB or other source
context.Identity.AddClaims(newClaim);
};
return cookieAuthenticationProvider;
}
}
您需要对每个请求应用声明的缺点,这可能不是很高效。但是在正确的位置进行适量的缓存会有所帮助。此外,这段代码并不是最容易工作的地方,因为它处于管道的早期阶段,您需要自己管理 DbContext
和其他依赖项。
优点是声明会立即应用于每个用户的请求,您无需重新登录即可立即更改权限。