asp.net – 如何全局创建CustomPrincipal(使用和不使用AuthorizeAttribute)

前端之家收集整理的这篇文章主要介绍了asp.net – 如何全局创建CustomPrincipal(使用和不使用AuthorizeAttribute)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的ASP.NET MVC4 Web应用程序有自定义Principal / Identity.我还创建了一个AuthorizeAttribute来实例化我的自定义主体,将它分配给需要身份验证的控制器中的httpContext.User.

这适用于使用我的AuthorizeAttribute修饰的控制器/操作,但是,对于不需要身份验证的控制器(但如果它在那里仍然使用它),我想得到我的CustomPrincipal(最好是通过HttpContext.User) ).

在这些非装饰的控制器/动作中,设置了HttpContext.User,但是使用了GenericPrincipal而不是我的CustomPrincipal.将GepertPrincipal的HttpContext.User的默认设置“覆盖”的最佳位置在哪里?

同样,如果在每个具有auth cookie的请求中完成此操作,那么在AuthorizeAttribute修饰控制器的情况下,我将如何避免两次执行该工作(这将成为强制认证的控制器).

为了清楚起见,我的网站允许匿名用户访问,但在这些页面上,如果经过身份验证(并实现了CustomPrincipal),则会提供额外的功能.

我认为有些选择(不一定是我的每个背后的逻辑):

>使用会话(并处理逻辑来创建我需要的东西,忘记校长)
> Application_AuthenticateRequest – 在网上看到这是旧学校的评论
>在基本控制器上设置自定义过滤器
>在基本控制器上创建一个AuthorizationAttribute,让每个人都能通过并设置HttpContext.User,因为我想要它
> IHttpModule – 这似乎是一种下降方式(除非其他人不同意,否则沿着这条路走下去).

思考?

解决方法

您可以使用全局操作过滤器.我们假设你有一个自定义委托人:
  1. public class MyPrincipal : GenericPrincipal
  2. {
  3. public MyPrincipal(IIdentity identity,string[] roles): base(identity,roles)
  4. {
  5. }
  6.  
  7. ... some custom properties and stuff
  8. }

然后你可以编写一个全局授权操作过滤器(但是它不是从基础AuthorizeAttribute派生来避免全局认证,它只是实现IAuthorizationFilter接口以确保它在任何其他过滤器之前运行):

  1. public class GlobalIdentityInjector : ActionFilterAttribute,IAuthorizationFilter
  2. {
  3. public void OnAuthorization(AuthorizationContext filterContext)
  4. {
  5. var identity = filterContext.HttpContext.User.Identity;
  6.  
  7. // do some stuff here and assign a custom principal:
  8. var principal = new MyPrincipal(identity,null);
  9. // here you can assign some custom property that every user
  10. // (even the non-authenticated have)
  11.  
  12. // set the custom principal
  13. filterContext.HttpContext.User = principal;
  14. }
  15. }

全局过滤器将在〜/ App_Start / FilterConfig.cs中注册,以确保它将应用于所有操作:

  1. public class FilterConfig
  2. {
  3. public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  4. {
  5. filters.Add(new GlobalIdentityInjector());
  6. }
  7. }

现在,您可以拥有自定义授权属性,该属性仅应用于需要身份验证的某些控制器操作:

  1. public class MyAuthorizeAttribute : AuthorizeAttribute
  2. {
  3. protected override bool AuthorizeCore(HttpContextBase httpContext)
  4. {
  5. var authorized = base.AuthorizeCore(httpContext);
  6. if (!authorized)
  7. {
  8. return false;
  9. }
  10.  
  11. // we know that at this stage we have our custom
  12. // principal injected by the global action filter
  13. var myPrincipal = (MyPrincipal)httpContext.User;
  14.  
  15. // do some additional work here to enrich this custom principal
  16. // by setting some other properties that apply only to
  17. // authenticated users
  18.  
  19. return true;
  20.  
  21. }
  22. }

然后你可以有两种类型的动作:

  1. public ActionResult Foo()
  2. {
  3. var user = (MyPrincipal)User;
  4.  
  5. // work with the custom properties that apply only
  6. // to anonymous users
  7.  
  8. ...
  9. }
  10.  
  11. [MyAuthorize]
  12. public ActionResult Bar()
  13. {
  14. var user = (MyPrincipal)User;
  15.  
  16. // here you can work with all the properties
  17. // because we know that the custom authorization
  18. // attribute set them and the global filter set the other properties
  19.  
  20. ...
  21. }

猜你在找的asp.Net相关文章