【发布时间】:2015-01-03 13:41:04
【问题描述】:
我可能会让事情变得过于复杂,但我们有一个内部 ASP.NET MVC5 SPA 和 AngularJS,使用 Windows 身份验证。此应用程序有一个 SQL 后端数据库,该数据库有一个用户表,其中包含他们的帐户名以及他们在应用程序中各自的角色。我们将调用另一个也启用了 Windows 身份验证的 Web API 应用程序。
我曾尝试研究如何使用 OWIN 处理授权,但找不到任何有关 OWIN 和 Windows 身份验证的具体示例。出现的所有内容都使用带有用户名和密码的表单身份验证。
如何为我的应用程序使用 OWIN 和 Windows Auth?这是我的 OAuthAuthorizationServerProvider 类的示例。
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
return;
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });
var container = UnityHelper.GetContainerInstance("***");
var securityHelper = container.Resolve<ISecurityHelper>();
User currentUser = securityHelper.GetCurrentUser(); // Validates user based on HttpContext.Current.User
if (currentUser == null)
{
context.SetError("invalid_grant", "The user could not be found.");
return;
}
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", currentUser.AccountName));
identity.AddClaim(new Claim("role", "user"));
context.Validated(identity);
}
}
更新: 糟糕,我忘了提供更多关于我们想要完成的任务的信息。如果可能,我们希望使用不记名身份验证票证,这样我们就不必在每次调用 Web api 方法时查找用户及其角色。
更新 2: 根据 Andrew 的要求,下面是我的 _securityHelper 类的 TLDR 版本,特别是 GetCurrentUser() 方法。你会注意到我正在尝试调用:
HttpContext.Current.GetOwinContext().Request.User.Identity.Name
这总是为用户返回 null。
public class SecurityHelper : ISecurityHelper
{
private readonly ISecurityGroupController _securityGroupController;
private readonly IUserController _userController;
private readonly IEmployeeController _employeeController;
private readonly IFieldPermissionController _fieldPermissionController;
private readonly IOACController _oacController;
public SecurityHelper(ISecurityGroupController securityGroupController,
IUserController userController,
IEmployeeController employeeController,
IFieldPermissionController fieldPermissionController,
IOACController oacController)
{
_securityGroupController = securityGroupController;
_userController = userController;
_employeeController = employeeController;
_fieldPermissionController = fieldPermissionController;
_oacController = oacController;
}
// ... other methods
public User GetCurrentUser()
{
User user = _userController.GetByAccountName(HttpContext.Current.GetOwinContext().Request.User.Identity.Name);
if (user != null)
{
List<OAC> memberships = _oacController.GetMemberships(user.SourceId).ToList();
if (IsTestModeEnabled() && ((user.OACMemberships != null && user.OACMemberships.Count == 0) || user.OACMemberships == null))
{
user.OACMemberships = memberships;
}
else if (!IsTestModeEnabled())
{
user.OACMemberships = memberships;
}
}
return user;
}
}
【问题讨论】:
标签: asp.net-mvc angularjs windows-authentication owin