【发布时间】:2019-03-28 09:21:00
【问题描述】:
我正在尝试为 ASP.NET Web API 创建自定义身份验证过滤器。以下是我的身份验证过滤器的代码
public class IDPAuthenticationFilter : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
var identity = new ClaimsIdentity();
identity.AddClaim(new Claim(ClaimTypes.Name, "testUser"));
identity.AddClaim(new Claim(ClaimTypes.Role, "client"));
identity.AddClaim(new Claim("testUser"));
identity.AddClaim(new Claim("APP:USERID", "50123"));
var principal = new GenericPrincipal(identity, new string[] { });
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
base.OnAuthorization(actionContext);
}
}
我已全局配置身份验证过滤器,并使用断点确认过滤器正在被调用。
config.Filters.Add(new IDPAuthenticationFilter());
问题是如果我将[System.Web.Http.Authorize] 属性添加到任何控制器,那么我会收到 401 Unauthorized 错误。我可以在控制器操作中使用User.Identity.Name 访问用户名,但是如果我添加授权属性,我会收到错误消息。有什么我想念的吗?
感谢您的宝贵时间。如果需要任何其他信息,请添加评论。
【问题讨论】:
-
如果我可能会问,您为什么要添加授权属性以及您的属性?
-
IDPAuthenticationFilter 用于设置 Identity 和 Authorize 属性以确保只有经过身份验证的用户才能访问控制器。
-
@cl0ud 在 Web API 中,身份验证过滤器处理身份验证,但不处理授权。授权应该通过授权过滤器或在控制器操作内部完成。
-
我问的原因是因为您正在创建一个继承自
AuthorizationFilterAttribute的IDPAuthenticationFilter。从根本上来说,这对我来说已经有缺陷了,AuthorizationFilters 顾名思义就是用于授权。 -
感谢您指出这一点,我已经进行了一些更改,现在我正在实施 IAuthenticationFilter。如果需要,将更新问题。
标签: c# asp.net asp.net-web-api asp.net-web-api-filters