当前,我有一个简单的自定义策略处理程序,如下所示:
protected override void Handle(AuthorizationContext context, UserPolicyRequirement requirement)
{
// authorize user against policy requirements
if (_authorizationTask.AuthorizeUserAgainstPolicy(context.User, requirement))
{
// User passed policy req's
context.Succeed(requirement);
}
}
问题是,此授权步骤需要花费很长时间才能执行,但这在网站的许多不同区域中都是必需的。是否有任何现成的机制可以保存/缓存此策略授权的结果,以便每个会话仅执行一次?
我目前正在使用Windows身份验证,如果有帮助的话。
如果per session
方法没有引起任何问题,则可以Session
用来存储用户数据。简单的实现如下所示:
首先,您需要一项服务来从任何商店获取用户数据
public interface IGetUserDataService
{
<type> GetUserData();
}
我假设有Session
配置(请参阅参考资料)和IGetUserDataService
实现。
然后,您需要创建一个middleware
要处理的Session
public class SessionMiddleware
{
private readonly RequestDelegate _next;
private readonly IGetUserDataService _getUserDataService;
public SessionMiddleware(RequestDelegate next, IGetUserDataService getUserDataService)
{
_next = next;
_getUserDataService = getUserDataService;
}
public async Task Invoke(HttpContext context)
{
//user data is obtained only once then is stored in Session
if (context.Session.Get("UserData") == null)
{
context.Session.Set("UserData", getUserDataService.GetData());
}
await _next.Invoke(context);
}
}
//In Startup.cs
app.UseMiddleware<SessionMiddleware>();
最终在处理程序中获取并使用会话数据
public class YourHandler : AuthorizationHandler<YourRequirement>
{
private readonly IHttpContextAccessor _accessor;
public YourHandler(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
protected override void Handle(AuthorizationContext context, PermissionRequirement requirement)
{
var userData =(<type>)_accessor.HttpContext.Session.Get("UserData");
// check
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句