(回复一个老问题,但可能对其他人有用)
我有一个类似的问题,我们需要在只支持基本或 kerberos 身份验证的 web api 前面放置一个外观。
我使用了这个解决方案,将传入的 url 转换为后端服务器的 url:http: //www.dotnetspeak.com/asp-net-mvc/using-webapi-in-multi-tier-web-application/
我在该解决方案中添加了一些逻辑来检查标头中的令牌(来自 asp.net 登录系统),因为 ExecuteAsync 在授权过滤器之前执行:
var token = controllerContext.Request.Headers.Authorization;
if (token != null && token.Scheme.Equals("bearer", StringComparison.InvariantCultureIgnoreCase))
{
var ticket = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token.Parameter);
if (ticket != null && ticket.Identity != null && ticket.Identity.IsAuthenticated)
{
var claimsPrincipal = new ClaimsPrincipal(ticket.Identity);
//From here, you can use the claimsPrinciple to check if user is allowed to even call the service.
var authorized = claimsPrincipal.IsInRole("Users");
}
}
如果 Startup.OAuthOptions 不可用,您可能需要将其转换为 Startup.cs 或 Startup.Auth.cs 中的静态变量。
因为我需要提供一种替代身份验证方法而不是后端服务的基本身份验证,所以添加了额外的标头更新以切换到基本身份验证。
//from the dotnetspeak solution (copy existing headers)
foreach (var httpRequestHeader in controllerContext.Request.Headers)
{
client.DefaultRequestHeaders.Add(httpRequestHeader.Key, httpRequestHeader.Value);
}
//Set basic authentication, whatever the original Authorization header might have been
//TODO: use lookup table or something like that to convert claimsPrinciple to matching domain user account
var byteArray = Encoding.ASCII.GetBytes(@"Domain\userId:password");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));