使用Windows帐户授权

时间:2014-07-02 13:25:51

标签: c# windows windows-store-apps

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

  1. 用户通过他们的帐户名/密码并将其发送到服务器。
  2. 服务器生成唯一令牌并将其返回给用户。
  3. 对于所有下一个请求,用户都使用此令牌。
  4. 现在我正在尝试仅使用Windows帐户进行授权 MSDN provide UserInformation class我可以获得name for the user accountdomain name for the user。但我认为这对我的授权方案来说还不够。

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

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

    感谢。

3 个答案:

答案 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)

一旦我遇到类似情况,(客户端应用程序需要连接到具有少量身份凭证的服务器。在自定义身份验证之后,将为没有声明的客户端授予令牌,然后每个客户端请求将针对给定令牌),如果你是这样的,考虑这个链接,它帮助我解决了这个问题。

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

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