c# - 捕获失败的授权策略

标签 c# asp.net-core asp.net-core-mvc asp.net-core-2.0

在 .Net Core 2 中,假设有一个授权策略检查用户是否存在特定声明:

public class CompletedProfileRequirement : AuthorizationHandler<CompletedProfileRequirement>, IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CompletedProfileRequirement requirement)
    {
        // Check that all required claims exist
        if (/* invalid user claims */) {
            context.Fail();
        }

        context.Succeed(requirement);
        return Task.FromResult(0);
    }
}

我们将策略检查放在 MVC Controller 之上:

[Authorize(Policy = "CompletedProfile")]
public class HomeController : Controller
{
     // Controller stuff
}

我如何编写 IAuthorizationFilter 以便我们可以捕获此特定 CompletedProfileRequirement 策略的失败,以便我们可以将用户重定向到他们可以完成他们的页面简介?

最佳答案

根据authorization documentation ,可以从您的 AuthorizationHandler 访问 MVC 上下文:

Frameworks such as MVC or Jabbr are free to add any object to the Resource property on the AuthorizationHandlerContext to pass extra information.

For example, MVC passes an instance of AuthorizationFilterContext in the Resource property. This property provides access to HttpContext, RouteData, and everything else provided by MVC and Razor Pages.

因此,你可以这样做:

public class CompletedProfileRequirement : AuthorizationHandler<CompletedProfileRequirement>, IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CompletedProfileRequirement requirement)
    {
        // Check that all required claims exist
        if (/* invalid user claims */) {

            // retrieve MVC context
            if (context.Resource is AuthorizationFilterContext mvcContext)
            {
                // we still need to mark the requirement as succeeded, 
                // otherwise responde code is 401 unauthorized
                context.Succeed(requirement);

                // HTTP 302 temporary redirect to your page
                mvcContext.HttpContext.Response.Redirect("/Home/Wherever", false);
                return Task.FromResult(0);
            }

        }

        context.Succeed(requirement);
        return Task.FromResult(0);
    }
}

关于c# - 捕获失败的授权策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49659485/

相关文章:

c# - 如何使用 Xamarin.Forms 将导航按钮添加到主详细信息页面的标题

c# - 如何检查 DataView.RowFilter 中的空白

c# - 无法将类型 'System.Drawing.Image' 转换为 'System.Drawing.Icon'

angular - 如何将 .Net Core Web Api 和 Angular 6 应用程序从 VS Code 发布到 Azure?

c# - 带有 cookie 中间件的 asp.net core - 访问授权请求数据

c# - 更新 Crystal 报表中的数据集

docker - Docker : Drive has not been shared

asp.net-core - _signInManager.GetExternalLoginInfoAsync() 总是返回 null 和打开 id 到 azure 广告

c# - dotnet core autofac 和 json 配置它们可以在控制台应用程序中一起工作吗

c# - .Net Core/ASP5 应用程序的构建路径是什么?