在我的Windows应用商店应用程序(c#)中,我有自己的授权机制:
现在我正在尝试仅使用Windows帐户进行授权
MSDN provide UserInformation class
我可以获得name for the user account
或domain name for the user
。但我认为这对我的授权方案来说还不够。
方法GetSessionInitiationProtocolUriAsync
看起来非常有趣,但我不知道如何正确使用Uri
进行授权。
如何在我的应用程序中使用Windows帐户进行授权? 注意:我对这两种情况感兴趣:当用户在域内时。
感谢。
答案 0 :(得分:4)
要实现这一点有很多,但是如果你想保持简单并拥有进程,你可以实现自己的身份验证方法,在成功的身份验证中,你可以从他们的密码和秘密盐构建一个哈希值,这可以返回用户作为cookie等用于验证之后的每个请求。
关于授权,您可以使用以下类或仅使用普通的RoleProviders来实现自己的或使用链接到本地计算机组或活动目录的基于角色的提供程序。
您可以使用下面描述的方法或使用ASP.Net的Authentication和授权提供程序(如果您的服务器在.net上运行)实现您自己的身份验证方法。基本上是Asp.Net Membership and role Providers。但是,下面详述的方法也允许您访问和修改角色以及有关用户的其他信息。
在.Net 3.5+中有一个名为System.DirectoryServices.AccountManagement的新命名空间。
来自MSDN的片段
System.DirectoryServices.AccountManagement命名空间提供 统一访问和操纵用户,计算机和组安全性 跨多个主要商店的主体:Active Directory 域服务(AD DS),Active Directory轻量级目录 服务(AD LDS)和机器SAM(MSAM)。
System.DirectoryServices.AccountManagement管理目录对象 独立于System.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类,但这会增加解决方案的复杂性。
我希望如果你需要更多信息,或者你认为它不是你想要的东西,请帮助我,我会尽力改善答案。
答案 1 :(得分:3)
首先,我担心您会混淆身份验证和授权
身份验证 - 证明用户的身份(就像我去银行时提供身份证明)
授权 - 决定是否允许身份执行某些操作(例如客户端“Nitz”是否可以占用帐户#44422)。
Microsoft帐户只能为您提供身份验证 - 客户端将使用某种方案向您的服务器证明它属于 bla@microsoft.com ,并且它是由您决定是否允许在您的申请中做任何事情(授权) 使用域帐户,您可以使用域组成员身份来帮助您进行授权(这在Windows服务器应用程序中很常见),您通常可以使用用户的身份验证令牌“免费”获得授权。
假设我理解正确并且您确实在寻找身份验证,则必须提供两种行为 - 一种用于使用域身份验证,另一种用于Microsoft帐户身份验证。这是因为两者之间的库和通信协议非常不同。
使用Microsoft Azure的人员this tutorial,您可以设置一个使用Microsoft帐户身份验证的示例应用程序/网站组合。
要使用域身份验证(kerberos / NTLM),您可以关注this post并在您的网站/服务中启用“集成Windows身份验证”(我假设它是IIS)。如果您不熟悉企业身份验证,我会很快说出正确设置(没有时间差异,AD问题等),身份验证是无缝的。如果有问题,请回到简单的“hello world”网站并从Internet Explorer进行测试。
对于每个场景,您最好创建一个“hello world”方法,返回用户的身份验证信息,以确保您做对了。
对于每种身份验证方法,您最终都会获得一个唯一ID(Microsoft帐户:UserId
。域帐户:SID
)。您的逻辑应将此信息转换为一组权限 - 例如维护一个表中包含ID的表,另一列中保存isAdmin
。在决定是否允许或拒绝来自客户的操作时,您的应用程序应参考此逻辑。
由于对公共用户进行身份验证的方法与用于企业用户的方法不同,因此当使用不同方法(例如DOMAIN\bla
和{{1}进行连接时,您可能最终会为同一用户提供不同的ID })。如果您打算同时提供这两种身份验证方法,则必须考虑到这一点(例如,通过创建一个“用户”表,其中包含一列用于Microsoft帐户ID,另一列用于域SID)。同时提供两种身份验证方法通常没什么意义,但它是您的应用程序。
希望我帮忙!
答案 2 :(得分:-1)
一旦我遇到类似情况,(客户端应用程序需要连接到具有少量身份凭证的服务器。在自定义身份验证之后,将为没有声明的客户端授予令牌,然后每个客户端请求将针对给定令牌),如果你是这样的,考虑这个链接,它帮助我解决了这个问题。
注意:您可以通过分别扩展claimAuthenticationManager和Claimsauthorizationmanager来实现自定义身份验证和授权