使用Windows帐户进行授权

本文关键字:授权 Windows 使用 | 更新日期: 2023-09-27 18:11:12

在我的Windows Store应用程序(c#)中,我有自己的授权机制:

  1. 用户通过他们的帐户名/密码并发送给服务器。
  2. 服务器生成唯一令牌并返回给用户。
  3. 对于所有下一个请求用户使用这个令牌。

现在我正在尝试仅使用Windows帐户进行授权。
MSDN提供UserInformation class,我可以得到name for the user accountdomain name for the user。但是我认为这对我的授权方案来说还不够。

方法GetSessionInitiationProtocolUriAsync看起来也很有趣,但我不知道如何正确使用Uri进行授权。

如何在我的应用程序中使用Windows帐户进行授权?
注:我对两种情况都感兴趣:当用户在域内或不在。

谢谢。

使用Windows帐户进行授权

有很多方法可以实现这一点,但是如果你想保持简单并拥有这个过程,你可以实现你自己的认证方法,在一个成功的认证中,你可以从他们的密码和秘密盐中建立一个哈希值,可以作为cookie等返回给用户,然后你使用它来验证每个请求。

关于授权,您可以通过使用下面的类或仅使用普通的旧RoleProviders实现您自己的或使用链接到本地机器组或活动目录的基于角色的提供者。

您可以使用下面描述的方法或使用ASP的身份验证和授权提供程序实现您自己的身份验证方法。. Net(如果您的服务器运行在。Net上)。基本上Asp。网络成员和角色提供者。但是,下面详细介绍的方法也将允许您访问和修改用户的角色和其他信息。

在。net 3.5+中有一个新的命名空间System.DirectoryServices.AccountManagement.

MSDN

System.DirectoryServices.AccountManagement命名空间提供用户、计算机和组安全的统一访问和操作跨多个主体存储的主体:Active Directory域服务(AD DS)、Active Directory轻量级目录服务(AD LDS)和机器SAM (MSAM)。

System.DirectoryServices。AccountManagement管理目录对象独立于系统之外。DirectoryServices名称空间。管理目录服务应用程序可以利用AccountManagement API,简化管理用户,计算机和组负责人。以前需要复杂的解决方案了解存储或冗长的代码,例如查找所有组来哪个用户属于哪个用户,都可以在几行代码中使用AccountManagement API。

您可以使用下面的代码轻松地在AD上验证用户凭据:

 bool valid = false;
 using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
 {
     valid = context.ValidateCredentials( username, password );
 }

如果您想使用本地机器帐户进行验证,您也可以更改构造函数:

new PrincipalContext(ContextType.Machine)

您可以查看其他选项的文档,此外,这将让您从商店获得各种信息,如会员资格等。

新的命名空间是微软试图简化DirectoryServices,我认为这是成功的,但如果你想要更多的控制,你可以使用DirectoryServices类,但这会增加解决方案的复杂性。

我希望这对你有帮助,如果你需要进一步的信息,或者你认为这不是你想要的,请告诉我,我会努力改进的。

首先,恐怕你混淆了身份验证和授权。
身份验证—证明用户的身份(比如我去银行时出示ID)
Authorization -决定是否允许一个身份执行某些操作(例如客户端"Nitz"是否可以消耗帐户#44422)。

一个Microsoft帐户只能为您提供身份验证 -客户端将使用一些方案向您的服务器证明它属于bla@microsoft.com,并且由您决定是否允许它在您的应用程序(授权)中做一些事情。
使用域帐户,您可以使用域组成员身份来帮助您进行授权(这在windows服务器应用程序中甚至很常见),您通常可以通过用户的身份验证令牌"免费"获得。

假设我正确理解了你,你确实在寻找身份验证,你必须提供两个行为-一个用于使用域身份验证,一个用于Microsoft帐户身份验证。这是因为两者之间的库和通信协议非常不同。

提供身份验证

使用本教程从微软Azure的家伙,你可以设置一个样例应用程序/网站组合,利用微软帐户认证。

要使用域认证(kerberos/NTLM),你可以按照这篇文章,简单地在你的网站/服务(我假设它是IIS)中启用"集成windows认证"。如果您是企业身份验证的新手,我将简短地说明,当设置正确(没有时差、AD问题等)时,身份验证是无缝的。如果有问题,退回到一个简单的"hello world"网站,并在Internet Explorer中测试它。

对于每个场景,您最好创建一个返回用户身份验证信息的"hello world"方法,以确保正确。

提供授权

使用每个身份验证方法,您最终获得一个唯一的ID (Microsoft帐户:UserId)。域帐号:SID)。你的逻辑应该把这个信息转换成一组权限——例如,维护一个表,其中一列有ID,另一列有isAdmin。在决定是否允许或拒绝来自客户端的操作时,应用程序应该参考此逻辑。

企业与公众结合

由于验证公共用户的方法与用于企业用户的方法不同,因此当从不同的方法(例如DOMAIN'blabla.blason@outlook.com)连接时,您可能最终会为同一用户获得不同的id。如果您打算同时提供两种身份验证方法,则必须考虑到这一点(例如,通过创建一个"user"表,其中一列用于Microsoft帐户id,另一列用于Domain sid)。通常同时提供两种身份验证方法没有什么意义,但这是你的应用。

希望我帮到你!

一旦我有类似的情况,(客户端应用程序需要连接到服务器很少的身份凭证。在自定义身份验证之后,将为客户端授予一个令牌,几乎没有声明,然后每个客户端请求将根据给定的令牌进行验证),如果您处于类似的情况,请考虑这个链接,它帮助我解决了这个问题。

http://bitoftech.net/2014/06/09/angularjs-token-authentication-using-asp-net-web-api-2-owin-asp-net-identity/

注意:您可以通过分别扩展claimsAuthenticationManager和Claimsauthorizationmanager来实现自定义身份验证和授权