【发布时间】:2014-02-20 10:59:49
【问题描述】:
我使用以下配置自托管 WebApi:
Visual Studio 2012 / .NET 4.0
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
// authentication
config.MessageHandlers.Add(new Shield.PresharedKeyAuthorizer());
// routing
config.Routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
appBuilder.UseWebApi(config);
}
我有一个简单的测试设置,带有以下 DelegatingHandler 来创建声明并将其附加到当前线程。
public class PresharedKeyAuthorizer : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var claims = new List<Claim>();
claims.Add(new Claim(ClaimTypes.Name, "superstar"));
var identity = new ClaimsIdentity(claims, "PresharedKey");
var principal = new ClaimsPrincipal(identity);
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
HttpContext.Current.User = principal;
return base.SendAsync(request, cancellationToken);
}
}
但是,当我点击标有Authorize 属性的ApiController 时,它无法识别身份验证。
[Authorize]
public class FilesController : ApiController
{
public IEnumerable<string> Get()
{
return new string[] { "Secure File A", "Secure File B" };
}
}
删除Authorize属性并设置断点,我可以看到RequestContext.Principal属性确实为null。该请求在没有Authorize 属性的情况下正常工作,所以我知道自托管的设置是正确的,但我必须在身份验证管道中遗漏一些东西。
为了让该声明与Authorize 属性相抵触,我缺少什么?
此相关答案在由 IIS 托管时似乎可以使用相同的方法:https://stackoverflow.com/a/14872968/118224
【问题讨论】:
标签: c# authentication asp.net-web-api owin claims-based-identity