【问题标题】:Authorization with using Windows Account使用 Windows 帐户进行授权
【发布时间】:2014-07-02 13:25:50
【问题描述】:

在我的 Windows Store App (c#) 中,我有自己的授权机制:

  1. 用户输入了他们的帐户名/密码并将其发送到服务器。
  2. 服务器生成唯一令牌并将其返回给用户。
  3. 对于用户使用此令牌的所有下一个请求。

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

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

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

谢谢。

【问题讨论】:

  • 您正在混合授权和身份验证,Windows 帐户是识别用户(身份验证),在您知道他是不是您授予他适当的访问权限(授权)之后。您正在寻找的任何情况都是基于声明的身份验证。我从未在 Windows 商店应用程序上使用过它,所以我不会发布回复,因为它可能会有所不同。
  • @Pedro.The.Kid 感谢您的评论。我想我会等一个在 Windows 应用商店应用程序中使用基于声明的身份验证经验的人。
  • 在我的 Windows 商店应用程序中,我通过 Live SDK 使用他们的 Microsoft 帐户登录用户。它将为每个用户生成一个唯一的令牌,客户端应用程序使用它向我的服务器注册。这对你有用吗?

标签: c# windows windows-store-apps


【解决方案1】:

有很多方法可以实现这一点,但如果您想保持简单并拥有流程,您可以实现自己的身份验证方法,在成功的身份验证后,您可以从他们的密码和可以返回的秘密盐构建一个哈希值以 cookie 等形式发送给用户,您可以使用它来验证之后的每个请求。

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

您可以使用下面描述的方法或使用Authentication 和 ASP.Net 的授权提供程序(如果您的服务器在 .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 用于简化用户、计算机和 小组负责人。以前需要复杂的解决方案 商店或冗长代码的知识,例如查找所有组以 用户所属的,只需几行代码即可完成 帐户管理 API。

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

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

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

new PrincipalContext(ContextType.Machine)

您可以查看文档以了解其他选项,此外,您还可以从商店获取各种信息,例如会员资格等。

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

如果您需要更多信息或者您认为这不是您正在寻找的内容,我希望这会有所帮助,请告诉我,我会努力改进答案。

【讨论】:

    【解决方案2】:

    首先,恐怕您混淆了身份验证和授权。
    身份验证 - 证明用户的身份(就像我去银行时出示身份证一样)
    授权 - 决定是否允许某个身份执行某些操作(例如客户端“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 和bla.blason@outlook.com)连接时,可能最终会为同一用户获得不同的 ID。如果您打算同时提供两种身份验证方法,则必须考虑到这一点(例如,通过创建一个“用户”表,其中一列用于 Microsoft 帐户 ID,一列用于域 SID)。同时提供两种身份验证方法通常没有什么意义,但这是您的应用程序。

    希望我能帮上忙!

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 很抱歉,ClaimsAuthenticationManager - 在 Windows 应用商店应用程序中不受支持。感谢您的帮助。
      猜你喜欢
      • 2020-02-22
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多