如何获取 AD 用户名以便使用 angular-js SPA / ASP.NET-MCV 启动不记名令牌身份验证
How do I get the AD username in order to initiate bearer token authentication with angular-js SPA / ASP.NET-MCV
我正在为我的公司开发一个 Angular JS SPA,它使用不记名令牌来验证用户。使用 ASP MCV 作为后端,我设置了 OWIN 中间件来处理服务器上的不记名令牌。我的目的是为网络应用程序的用户生成不记名令牌以锁定暴露的 APIs。这里的问题是我需要根据 AD 用户的 Doamain\Username 生成不记名令牌,但要使不记名令牌起作用,我无法启用 windows 身份验证。登录不是一个选项,必须对用户的 AD 凭据进行验证。
到目前为止我已经取得的成就:
在禁用 windows 身份验证并启用匿名身份验证的情况下,我的 API 可以根据 header 中传递给它的不记名令牌来验证请求。为此,我创建了一个虚拟用户。
我需要达到的目标:
以 'DOMAIN\Username' 的形式为用户获取 AD 用户名,以便我可以基于此创建不记名令牌。 (到目前为止,我只能在启用 windows 身份验证的情况下执行此操作)
我遇到的问题是我无法启用 windows 身份验证,否则当我将 [Authorize] 属性放在 API 上时,它将根据 [=31] 进行验证=] 身份验证,无论持有者令牌是否有效。
您可能认为我正在尝试做的事情毫无意义,因为我可以使用 windows 身份验证,但我需要不记名令牌,以便只能从我的 SPA 调用 APIs为了安全。
到目前为止,我设法通过在启用了 windows 身份验证的不同 Web 项目中创建 API 来获取用户 ID,但是,页面加载时间受到了影响,所以我想避免去关闭以这种方式获取用户 ID。
最终弄明白了,现在可以回答我自己的问题了。
我在web.config.
然后也在 web.config 我在 configuration
节点
中添加了以下代码
<location path="api">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" />
<windowsAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
</location>
这就是说,对于位置路径中包含 'API' 的所有 api 调用(我所有需要不记名令牌身份验证的 API 的路由前缀都以 'api'), 禁用 windows 身份验证和启用 匿名身份验证。通过启用匿名身份验证,我允许不记名令牌对 API 调用进行身份验证,而不是让 windows 身份验证具有最终决定权。
当找到具有 windows 身份验证的用户 ID 时,这必须调用一个 API,它没有以 'api' 开头的路由前缀,所以在我的例子中我的 'AuthenticateUser' api 的路由前缀为
[RoutePrefix("authentication")]
web.config 不会禁用 windows 身份验证,使我能够使用
获取当前用户的值
HttpContext.Current.Request.LogonUserIdentity.Name
对于所有其他需要授权的 API,请确保它们具有以“api 开头的路由前缀并使用 [Authorize]
属性。
编辑
我应该指出,为了像我在 web.config 中那样进行 enable/disable 匿名身份验证和 windows 身份验证,您必须首先允许它们在 IIS HostFile 中被覆盖,否则它不会'没用。
我正在为我的公司开发一个 Angular JS SPA,它使用不记名令牌来验证用户。使用 ASP MCV 作为后端,我设置了 OWIN 中间件来处理服务器上的不记名令牌。我的目的是为网络应用程序的用户生成不记名令牌以锁定暴露的 APIs。这里的问题是我需要根据 AD 用户的 Doamain\Username 生成不记名令牌,但要使不记名令牌起作用,我无法启用 windows 身份验证。登录不是一个选项,必须对用户的 AD 凭据进行验证。
到目前为止我已经取得的成就: 在禁用 windows 身份验证并启用匿名身份验证的情况下,我的 API 可以根据 header 中传递给它的不记名令牌来验证请求。为此,我创建了一个虚拟用户。
我需要达到的目标: 以 'DOMAIN\Username' 的形式为用户获取 AD 用户名,以便我可以基于此创建不记名令牌。 (到目前为止,我只能在启用 windows 身份验证的情况下执行此操作)
我遇到的问题是我无法启用 windows 身份验证,否则当我将 [Authorize] 属性放在 API 上时,它将根据 [=31] 进行验证=] 身份验证,无论持有者令牌是否有效。
您可能认为我正在尝试做的事情毫无意义,因为我可以使用 windows 身份验证,但我需要不记名令牌,以便只能从我的 SPA 调用 APIs为了安全。
到目前为止,我设法通过在启用了 windows 身份验证的不同 Web 项目中创建 API 来获取用户 ID,但是,页面加载时间受到了影响,所以我想避免去关闭以这种方式获取用户 ID。
最终弄明白了,现在可以回答我自己的问题了。
我在web.config.
然后也在 web.config 我在 configuration
节点
<location path="api">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="true" />
<windowsAuthentication enabled="false" />
</authentication>
</security>
</system.webServer>
</location>
这就是说,对于位置路径中包含 'API' 的所有 api 调用(我所有需要不记名令牌身份验证的 API 的路由前缀都以 'api'), 禁用 windows 身份验证和启用 匿名身份验证。通过启用匿名身份验证,我允许不记名令牌对 API 调用进行身份验证,而不是让 windows 身份验证具有最终决定权。
当找到具有 windows 身份验证的用户 ID 时,这必须调用一个 API,它没有以 'api' 开头的路由前缀,所以在我的例子中我的 'AuthenticateUser' api 的路由前缀为
[RoutePrefix("authentication")]
web.config 不会禁用 windows 身份验证,使我能够使用
获取当前用户的值HttpContext.Current.Request.LogonUserIdentity.Name
对于所有其他需要授权的 API,请确保它们具有以“api 开头的路由前缀并使用 [Authorize]
属性。
编辑 我应该指出,为了像我在 web.config 中那样进行 enable/disable 匿名身份验证和 windows 身份验证,您必须首先允许它们在 IIS HostFile 中被覆盖,否则它不会'没用。