如何重定向ActionFilter
到 Asp.net Core 2.2 中的另一个控制器/操作
上下文.异常处理; //不显示
我已经尝试了这些线程的所有选项:
这是我的代码
public class ValidaEmpresaActionFilter : IActionFilter
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly IHttpContextAccessor _contextAccessor;
public ValidaEmpresaActionFilter(UserManager<ApplicationUser> userManager, IHttpContextAccessor contextAccessor)
{
_userManager = userManager;
_contextAccessor = contextAccessor;
}
public async void OnActionExecuting(ActionExecutingContext context)
{
string username = _contextAccessor.HttpContext.User.Identity.Name;
var user = await _userManager.FindByNameAsync(username);
// all options i tried Option 1
if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
{
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("action", "Index");
redirectTargetDictionary.Add("controller", "Home");
context.Result = new RedirectToRouteResult(redirectTargetDictionary);
}
// option #2
if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
context.Result = new RedirectResult("~/Home/index");
// option #3
if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
{
context.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "controller", "Home" },
{ "action", "Index" }
});
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
Run Code Online (Sandbox Code Playgroud)
在启动/配置服务中
services.AddScoped<ValidaEmpresaActionFilter>();
Run Code Online (Sandbox Code Playgroud)
刚刚添加了这一行
await context.Result.ExecuteResultAsync(context);
这是结果代码:
public async void OnActionExecuting(ActionExecutingContext context)
{
string username = _contextAccessor.HttpContext.User.Identity.Name;
var user = await _userManager.FindByNameAsync(username);
if (user.EmpresaPrincipal == null || user.EmpresaPrincipal < 1)
{
RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
redirectTargetDictionary.Add("action", "Index");
redirectTargetDictionary.Add("controller", "Home");
redirectTargetDictionary.Add("area", "");
context.Result = new RedirectToRouteResult(redirectTargetDictionary);
await context.Result.ExecuteResultAsync(context);
}
}
Run Code Online (Sandbox Code Playgroud)
听说我做了[MyAuth]
操作过滤器,如果身份验证通过,则继续,否则重定向到“访问被拒绝”页面
public class MyAuth : ActionFilterAttribute
{
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var headers = context.HttpContext.Request.Headers;
if(headers.ContainsKey("Authentication"))
{
var value = AuthenticationHeaderValue.Parse(headers["Authentication"]);
var bytes = Convert.FromBase64String(value.Parameter);
var crendentials = Encoding.UTF8.GetString(bytes).Split(":");
var username = crendentials[0];
var password = crendentials[1];
if(Validate(username, password))
{
// user is valid, huuuray
base.OnActionExecutionAsync(context, next);
return;
}
}
// should redirect to somewhere
context.Result = new RedirectResult("~/api/access_deny");
await context.Result.ExecuteResultAsync(context);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意添加这一行:
await context.Result.ExecuteResultAsync(context);
Run Code Online (Sandbox Code Playgroud)
在我的 Api 控制器中的某个地方,在执行任何操作之前都需要我的自定义[MyAuth]
:
await context.Result.ExecuteResultAsync(context);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1479 次 |
最近记录: |