我有一个客户端要求使用自定义角色/成员资格架构的基于身份验证的集成解决方案。我最初的计划是使用基于声明的身份验证机制和集成身份验证。但是,我最初的研究并没有提供大量有用的信息。
到目前为止,我有一个ASP.NET(非核心或owin)WebAPI应用程序,它具有基于角度SPA(asp.net)Web应用程序使用的api操作。我试图使用集成身份验证授权api调用。我最初的工作重点是自定义AuthorizationAttribute和ClaimsAuthenticationManager实现。然而,随着我深入研究,我开始遇到自定义ClaimsAuthenticationManager的问题,此时我不确定这是正确的路径。
所以我对你们所有人的问题是,你能否至少给我一些关于如何实现这一目标的想法?我不需要帮助代码的各个部分,只需要弄清楚适当的"堆栈"可以这么说。
唯一真正的要求是WebAPI调用可以被授权,自定义属性传递声明的名称以进行授权,但声明不在AD中,即使它使用的是Windows身份验证,声明本身也来自数据库中。
提前谢谢大家!
答案 0 :(得分:2)
请看https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api。
您的方案没有太大区别:
简单地说,这可以通过配置web-api来使用Windows身份验证来解决。
<system.web>
<authentication mode="Windows" />
</system.web>
并将自己的IAuthorizationFilter
添加到Web API管道,该管道将检查当前主体(应该设置),然后使用您自己的主体覆盖此主体(即查询db - 获取声明,并使用您的自定义覆盖它通过设置HttpContext.Current.User
和Thread.CurrentPrincipal
来声明主体。
有关如何向WebAPI管道添加过滤器,请查看How to add global ASP.Net Web Api Filters?
public class CustomAuthenticationFilter : IAuthenticationFilter {
public bool AllowMultiple { get { return true; } }
public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) {
var windowsPrincipal = context.Principal as WindowsPrincipal;
if (windowsPrincipal != null) {
var name = windowsPrincipal.Identity.Name;
// TODO: fetch claims from db (i guess based on name)
var identity = new ClaimsIdentity(windowsPrincipal.Identity);
identity.AddClaim(new Claim("db-crazy-claim", "db-value"));
var claimsPrincipal = new ClaimsPrincipal(identity);
// here is the punchline - we're replacing original windows principal
// with our own claims principal
context.Principal = claimsPrincipal;
}
return Task.FromResult(0);
}
public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) {
return Task.FromResult(0);
}
}
public static class WebApiConfig {
public static void Register(HttpConfiguration config) {
config.Filters.Add(new CustomAuthenticationFilter());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute( ... );
}
}
此外,不需要自定义授权属性 - 使用默认属性 - 每个人都能理解它,并使您的代码更具可读性。
答案 1 :(得分:0)
看看这篇文章。当我在解决你所描述的问题时,我发现它非常有用。
https://leastprivilege.com/2015/07/24/simplified-asp-net-and-mvc-6-security-templates/