tel*_*all 4 asp.net asp.net-mvc forms-authentication iprincipal
我的ASP.NET MVC4 Web应用程序有一个自定义Principal/Identity.我还创建了一个AuthorizeAttribute来实例化我的自定义主体,并将其分配给需要身份验证的控制器中的httpContext.User.
这适用于使用我的AuthorizeAttribute修饰的控制器/操作,但是,对于不需要身份验证的控制器(但如果它在那里仍然使用它),我想得到我的CustomPrincipal(最好是通过HttpContext.User) ).
在这些未装饰的控制器/动作中,设置了HttpContext.User,但是使用了GenericPrincipal而不是我的CustomPrincipal.将覆盖HttpContext.User的默认设置的最佳位置放在GenericPrincipal的哪个位置?
同样,如果在每个具有auth cookie的请求中都这样做,那么在AuthorizeAttribute修饰控制器的情况下,我将如何避免两次工作(这将成为强制认证的控制器).
为了清楚起见,我的网站允许匿名用户访问,但在这些页面上,如果经过身份验证(并实现了CustomPrincipal),则会提供额外的功能.
我认为有些选择(不确定每个选项背后的逻辑):
思考?
Dar*_*rov 18
您可以使用全局操作筛选器.我们假设你有一个自定义委托人:
public class MyPrincipal : GenericPrincipal
{
public MyPrincipal(IIdentity identity, string[] roles): base(identity, roles)
{
}
... some custom properties and stuff
}
Run Code Online (Sandbox Code Playgroud)
然后你可以编写一个全局授权操作过滤器(但它不是从基础派生的,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;
}
}
Run Code Online (Sandbox Code Playgroud)
将注册全局过滤器,~/App_Start/FilterConfig.cs以确保它将适用于所有操作:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new GlobalIdentityInjector());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以拥有自定义授权属性,该属性仅应用于需要身份验证的某些控制器操作:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以有两种类型的动作:
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
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4938 次 |
| 最近记录: |