gpt4 book ai didi

c# - 如何通过 ASP.NET Web API 使用 Active Directory 身份验证?

转载 作者:太空狗 更新时间:2023-10-29 17:57:20 25 4
gpt4 key购买 nike

我们有一个 Web API 应用程序,它提供了许多客户端可以调用和使用的 Web 方法。它将托管在 IIS 中并具有 SSL 设置。

用户凭据存储在 Active Directory 中,但客户端不仅在我们的域内,它们可以在世界任何地方,所以我们的理解是我们不能使用 Windows 集成身份验证。

如上所述,在我们的场景中对用户进行身份验证的最佳方式是什么?

我是否应该要求用户在他们发出的每个请求的 header 中传递用户名/密码?然后我以编程方式根据我们的 Active Directory 验证用户凭据(我们已经有一个组件可以做到这一点)例如通过创建一个在每个 Action 执行之前运行的自定义 ActionFilter?

另一种方法可能是创建一个 HttpModule,它在每个请求之前运行并进行身份验证,如果无效则中止请求。

我的自定义属性看起来像这样:

 public class ActiveDirectoryAuthAttribute : ActionFilterAttribute
{
// todo: load from config which can change depending on deployment environment
private static readonly bool ShouldRequireHttps = false;

public override void OnActionExecuting(HttpActionContext actionContext)
{
IPrincipal principal = this.Authentiate(actionContext);

if (principal == null)
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
}
else
{
this.SetPrincipal(principal);
}
}

private IPrincipal Authentiate(HttpActionContext actionContext)
{
if (IsUriSchemaValid(actionContext.Request.RequestUri))
{
// is the client certificate known and still valid?
// is IP valid?
// find user credentials and validate against AD
// create the Principle object and return it
}

return null;
}

private void SetPrincipal(IPrincipal principal)
{
Thread.CurrentPrincipal = principal;

if (HttpContext.Current != null)
{
HttpContext.Current.User = principal;
}
}

private static bool IsUriSchemaValid(Uri uri)
{
bool result = true;

if (ShouldRequireHttps)
{
if (!string.Equals(uri.Scheme, "https", StringComparison.InvariantCultureIgnoreCase))
{
result = false;
}
}

return result;
}
}

然后在我的 Controller 操作中,我可以访问 Principle 对象:

IPrincipal principle = this.User;

如上所述,在我们的场景中对用户进行身份验证/授权的最佳方式是什么?

在上面,如何从 IPrinciple 创建一个对象?是否有任何现有的 .NET 类,或者我必须创建我的自定义类?

最佳答案

我最近在 AD 方面做了一些工作,老实说,我想不出另一种方法来处理这个问题。

使用 OAuth 类型的方法可能更有意义。提供一个 token 类型的路由,该路由最初将采用用户名和密码,并将自创作和加密的 token 返回给被调用者。完成第一次初始调用后,将 token 发送回被调用方,然后他们可以在每次后续调用 API 时在授权 header 中使用该 token 。

token 将在一次调用或很短的时间内有效。每次您认为 token 被使用时,再发出一个。

您还可以考虑为此使用自定义 OAuth 实现,而不是使用数据库进行身份验证过程,使用您的 AD 身份存储并使用 OAuth Bearer token 。由于您使用的是 SSL,这实际上非常适合您的场景。

关于c# - 如何通过 ASP.NET Web API 使用 Active Directory 身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16314773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com