在Windows API中混合Windows身份验证和个人帐户

时间:2017-05-15 10:49:08

标签: c# oauth-2.0 asp.net-web-api2

我有一个使用个人帐户并正确发放令牌的网络API。我修改它以接受本机应用程序的社交身份验证。

现在,我想为内部员工添加选项,以使用他们的域凭据访问该API,而不是创建新的用户名和密码。

员工应该调用api / token来获取令牌,但是,他们会传递身份,即域凭据。

有关如何区分普通用户名和密码以及域凭据以及完全执行更改的位置的任何想法?

1 个答案:

答案 0 :(得分:0)

我成功了,但我只是想确保自己没有遇到安全问题,我已准备好发表评论。

首先,我更改的所有内容都在提供程序文件中:ApplicationOAuthProvider.cs:

  1. 创建新的私有变量以定义客户端是否要使用域登录:

    <svg ...>
        <path fill="currentColor" ... />
    </svg>
    
  2. 修改了负责发出令牌的第一个任务,因此它检查请求正文中的新参数(DomainUser):private bool DomainUser = false;

    grant_type=password&username=username&password=password&DomainUser=true
  3. 修改了验证用户名和密码的任务,因此首先它将检查这是否是对DomainUser的请求,并对域进行身份验证,否则,它将照常继续:

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        // Resource owner password credentials does not provide a client ID.
        if (context.ClientId == null)
        {
            DomainUser = context.Parameters["DomainUser"] == "true";
            context.Validated();
        }
    
        return Task.FromResult<object>(null);
    }
    
  4. 其中函数IsValidCredentials将验证域的凭据(您需要添加对public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); ApplicationUser user; if (DomainUser && IsValidCredentials(context.UserName, context.Password, "MyDomain")) user=await PrepareDomainUser(context); else user = await userManager.FindAsync(context.UserName, context.Password); 的引用):

    System.DirectoryServices.AccountManagement

    如果这是第一次创建应用程序用户,PrepareDomainUser将创建无密码:

        private static bool IsValidCredentials(string Username, string Password, string Domain)
        {
            using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
            {
                return pc.ValidateCredentials(Username, Password);
            }
        }