我正在使用AngularJS和.Net Web API开发SPA。我在应用程序向导中选择个人帐户作为身份验证类型。它使用owin提供程序为基于声明的oAuth身份验证创建了类。
现在我还需要进行Windows Active Directory身份验证。还需要一个基于角色的安全性,可由管理员用户配置。
我需要在向导生成的当前代码中对使用AD对用户进行身份验证进行哪些更改,如果在那里找不到,请使用当前的oAuth实现进行身份验证,最后将声明令牌返回给客户端?
我正在考虑在首次使用其AD凭据登录时将我的活动目录用户的用户ID存储在应用程序数据库中。这样我就可以为他们分配角色了
答案 0 :(得分:1)
我建议您使用OpenId connect IdentityServer3(。Net) - 它可以轻松地与AD集成(您可以在AD域内使用客户端的Kerberos票证,它也可以检查AD域之外的用户登录名/密码),还有很多开箱即用的例子如何在JavaScript中使用它。因此很容易在我的一个带有.Net后端的AngularJS应用程序中实现它。
此外,IdentityServer还在登录过程中使用InMemoryUserService中的所有用户相关数据对用户进行内存中缓存。因此,您不必开发用户相关数据的缓存,它在IdentityServer中也是开箱即用的。
可以帮助与AD集成的修改:
string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
要通过域登录名和密码对AD域外的用户进行身份验证,您可以修改InMemoryUserService.cs以进行检查。举个例子:
var user_passhash = GetString(GenerateSaltedHash(GetBytes(password)));
var query =
from u in _users
where u.Username == username && u.Password == user_passhash
select u;
var user = query.SingleOrDefault();
if (user == null)
{
var domain = ConfigurationManager.AppSettings["domain"];
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
{
bool isValid = pc.ValidateCredentials(username, password);
if (isValid)
{
EmployeePoco employee = this.employeeManager.GetEmployee(username);