首页 文章

如何使用angular-js SPA / ASP.NET-MCV获取AD用户名以启动持有者令牌身份验证

提问于
浏览
1

我正在为我的公司开发一个Angular JS SPA,它使用承载令牌来验证用户 . 使用ASP MCV作为后端,我已经设置了OWIN中间件来处理服务器上的承载令牌 . 我的目的是为Web应用程序的用户生成承载令牌以锁定暴露的API . 这里的复杂性是我需要根据AD用户的Doamain \ Username生成承载令牌,但是为了使承载令牌起作用,我无法启用Windows身份验证 . 登录不是一个选项,必须在用户的AD凭据上验证用户 .

So far what I have managed to achieve: 在禁用Windows身份验证并启用匿名身份验证的情况下,我已经获得了基于在标头中传递给它的持有者令牌来验证请求的API . 为此,我创建了一个虚拟用户 .

What I need to achieve: 为用户获取'DOMAIN\Username'形式的AD用户名,以便我可以基于此创建承载令牌 . (到目前为止,我只能启用Windows身份验证)

我遇到的问题是我无法启用Windows身份验证,否则当我在API上放置[Authorize]属性时,它将根据Windows身份验证进行验证,无论是否有效的承载令牌 .

您可能会认为我正在尝试做的事情毫无意义,因为我可以使用Windows身份验证,但我需要承载令牌,以便只能从我的SPA调用API以确保安全性 .

到目前为止,我设法通过在启用了Windows身份验证的不同Web项目中创建API来获取用户ID,但是,页面加载时间受到影响所以我想避免以这种方式获取用户ID .

1 回答

  • 1

    最终想出来,现在可以回答我自己的问题了 .

    我已将 enabled 的Windows身份验证和用户模拟以及匿名身份验证设置为web.config中的 false .

    然后在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'开头的路由前缀), disable windows身份验证和 enable 匿名身份验证 . 通过启用匿名身份验证,我允许承载令牌验证API调用,而不是让Windows身份验证最终说出来 .

    当使用Windows身份验证查找用户ID时,必须调用没有以'api'开头的路由前缀的API,因此在我的情况下,我的'AuthenticateUser'api的路由前缀为

    [RoutePrefix("authentication")]
    

    然后web.config不会禁用Windows身份验证,这使我能够获取当前用户的值

    HttpContext.Current.Request.LogonUserIdentity.Name
    

    对于需要授权的所有其他API,请确保它们具有以“api”开头且使用 [Authorize] 属性的路由前缀 .

    EDIT 我应该指出,为了像我在web.config中那样启用/禁用匿名身份验证和Windows身份验证,您必须首先允许它们在IIS HostFile中被覆盖,否则它将无法工作 .

相关问题