asp.net – 如何全局创建CustomPrincipal(使用和不使用Authorize
我的ASP.NET MVC4 Web应用程序有自定义Principal / Identity.我还创建了一个AuthorizeAttribute来实例化我的自定义主体,将它分配给需要身份验证的控制器中的httpContext.User.
这适用于使用我的AuthorizeAttribute修饰的控制器/操作,但是,对于不需要身份验证的控制器(但如果它在那里仍然使用它),我想得到我的CustomPrincipal(最好是通过HttpContext.User) ). 在这些非装饰的控制器/动作中,设置了HttpContext.User,但是使用了GenericPrincipal而不是我的CustomPrincipal.将GepertPrincipal的HttpContext.User的默认设置“覆盖”的最佳位置在哪里? 同样,如果在每个具有auth cookie的请求中完成此操作,那么在AuthorizeAttribute修饰控制器的情况下,我将如何避免两次执行该工作(这将成为强制认证的控制器). 为了清楚起见,我的网站允许匿名用户访问,但在这些页面上,如果经过身份验证(并实现了CustomPrincipal),则会提供额外的功能. 我认为有些选择(不一定是我的每个背后的逻辑): >使用会话(并处理逻辑来创建我需要的东西,忘记校长) 思考? 解决方法
您可以使用全局操作过滤器.我们假设你有一个自定义委托人:
public class MyPrincipal : GenericPrincipal { public MyPrincipal(IIdentity identity,string[] roles): base(identity,roles) { } ... some custom properties and stuff } 然后你可以编写一个全局授权操作过滤器(但是它不是从基础AuthorizeAttribute派生来避免全局认证,它只是实现IAuthorizationFilter接口以确保它在任何其他过滤器之前运行): public class GlobalIdentityInjector : ActionFilterAttribute,IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { var identity = filterContext.HttpContext.User.Identity; // do some stuff here and assign a custom principal: var principal = new MyPrincipal(identity,null); // here you can assign some custom property that every user // (even the non-authenticated have) // set the custom principal filterContext.HttpContext.User = principal; } } 全局过滤器将在?/ App_Start / FilterConfig.cs中注册,以确保它将应用于所有操作: public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new GlobalIdentityInjector()); } } 现在,您可以拥有自定义授权属性,该属性仅应用于需要身份验证的某些控制器操作: public class MyAuthorizeAttribute : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContextBase httpContext) { var authorized = base.AuthorizeCore(httpContext); if (!authorized) { return false; } // we know that at this stage we have our custom // principal injected by the global action filter var myPrincipal = (MyPrincipal)httpContext.User; // do some additional work here to enrich this custom principal // by setting some other properties that apply only to // authenticated users return true; } } 然后你可以有两种类型的动作: public ActionResult Foo() { var user = (MyPrincipal)User; // work with the custom properties that apply only // to anonymous users ... } [MyAuthorize] public ActionResult Bar() { var user = (MyPrincipal)User; // here you can work with all the properties // because we know that the custom authorization // attribute set them and the global filter set the other properties ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 使用ToString()和@ Html.DisplayFor
- 在ASP.NET中如何处理未处理的异常?
- asp.net – 使用母版页在Aspx页面中引用CSS工作表
- asp.net-mvc-3 – 在远程部署MVC3时获取“CS0103:当前上下
- 在ASP.NET网站中指定版本号的位置
- asp.net – C#:GDI:使用位图的保存方法过度写入图像
- asp.net – iis 7.0,模块订单更改
- asp.net-mvc – 在kendo窗口中使用表单的PartialView
- 在asp.net页面之间传递数据
- asp.net-mvc – ValidateAntiForgeryToken属性
- asp.net-mvc – ASP.NET MVC的示例企业应用程序?
- asp.net-mvc – 如何使用编辑器内部的foreach
- asp.net – 异常日志记录HttpModule不会从ASP .N
- asp.net – 如何拦截WCF .svc服务中对方法的所有
- .net – WebApi传输字节数组为空
- asp.net-web-api2 – 在WebAPI2项目中加载System
- ASP.NET开发人员试图学习Drupal和PHP
- asp.net-mvc-5 – 在web api 2 web服务中处理方法
- asp.net-mvc – ASP.Net MVC的AntiForgeryToken方
- asp.net-mvc – 应用程序不记录