什么是 WPF 和 WCF 应用程序的用户身份验证/授权的“最佳实践”?
Posted
技术标签:
【中文标题】什么是 WPF 和 WCF 应用程序的用户身份验证/授权的“最佳实践”?【英文标题】:What is considered "best practice" for user authentication/authorization for WPF and WCF applications? 【发布时间】:2015-09-26 23:58:00 【问题描述】:假设我有一个 .NET 富客户端 (WPF) 应用程序,它将同时部署在 3 个不同的场景中:
-
客户端和服务器代码在单个进程中运行
客户端代码在 Intranet 计算机上运行,并通过 WCF 与运行应用程序/域/基础架构代码的服务器计算机进行通信
与#2 相同,但客户端可以在防火墙外的机器上运行。应集中维护用户和角色的自定义列表(即,凭据不基于 Windows 登录)
为这个应用程序实现相同的用户授权/身份验证模型的简单且经过验证的做法是什么?即,我想在我的表示层、应用程序层、域层等中使用相同的方法,而不管应用程序是如何部署的。
是否应该通过我现有的实体框架模型在我的 SQL 数据库中明确维护用户/角色? Thread.CurrentPrincipal
应该是需要授权某些应用程序功能的代码使用的方法,还是应该对某些 IUserService
进行依赖注入?
这是一个低调的应用程序,因此安全性并不是至关重要的——只是一些基本的东西。
谢谢
编辑
在花费数小时研究 WIF/基于声明的身份验证后,我仍然没有看到任何有关如何创建采用此类安全性的独立 .NET 桌面应用程序的指导。所有讨论都针对 ASP.NET 或 WCF。我需要我的应用程序使用可用于分布式 (WCF) 和独立部署方案的标准方法
【问题讨论】:
查看基于声明的身份验证和基于声明的授权。它的一部分。网络框架 谢谢;请看我的编辑 我还没有尝试过这些,但是搜索“自定义身份验证 wpf”会显示 social.technet.microsoft.com/wiki/contents/articles/… 和具有相同基本内容的页面,例如 blog.magnusmontin.net/2013/03/24/custom-authorization-in-wpf 【参考方案1】:一般来说,最好使用基于令牌的身份验证,例如 JWT。主要原因是它在各种类型的客户端和服务器中的灵活性。例如,如果将来您需要在解决方案中添加移动应用程序(ios、android 等),您可以毫无问题地做到这一点。您还可以使用 WebApi 等 Restful 服务来增强您的应用程序。
因此,如果您要开始该项目,我对您的建议是使用基于令牌的身份验证。
查看这些网址,您可能会发现它们很有用:
https://msdn.microsoft.com/en-us/library/ms751506%28v=vs.110%29.aspx
http://www.rhyous.com/2015/02/05/basic-token-service-for-wcf-services-part-1/
【讨论】:
谢谢。自从我发布这篇文章以来,我已经将我的想法转向了 WebAPI,但仍然对它知之甚少。您能否提供任何关于基于令牌的身份验证如何在 WebAPI 中工作的链接?我需要使用自定义 IPrincipal 实现与依赖 Thread.CurrentPrincipal 模型的现有服务器代码集成的东西。我不清楚所有这些通信/令牌内容如何映射到线程的 IPrincipal 以便代码提出授权要求。 不客气。看看这个:codeproject.com/Articles/1005485/… 谢谢--看起来那里有很多很棒的信息。我不清楚的一件事:那篇文章讨论了“基于令牌的身份验证”,但它是专门指 JWT 吗? 这是一个关于如何应用基于令牌的身份验证的一般主题,但没关系JWT(Java Web Token)只是一种令牌格式,您也可以使用相同的过程来使用JWT。 【参考方案2】:看看这个。我想这就是你要找的东西:
https://gist.github.com/stonetip/8745656
var tokenHandler = new JwtSecurityTokenHandler();
var convertedSecret = EncodeSigningToken(ConfigurationManager.AppSettings["ClientSecret"]);
// Set the expected properties of the JWT token in the TokenValidationParameters
var validationParameters = new TokenValidationParameters()
AllowedAudience = ConfigurationManager.AppSettings["AllowedAudience"],
ValidIssuer = ConfigurationManager.AppSettings["Issuer"],
SigningToken = new BinarySecretSecurityToken(convertedSecret)
;
Thread.CurrentPrincipal = tokenHandler.ValidateToken(token, validationParameters);
if (HttpContext.Current != null)
HttpContext.Current.User = Thread.CurrentPrincipal;
【讨论】:
以上是关于什么是 WPF 和 WCF 应用程序的用户身份验证/授权的“最佳实践”?的主要内容,如果未能解决你的问题,请参考以下文章
客户端 WPF 应用程序如何使用 Azure 上的 WCF 服务进行身份验证?
使用 Windows 身份验证的 IIS 托管 WCF 服务和 SQL 查询
使用 RESTful WCF 和 Windows 窗体的用户/通过身份验证