WPF和WCF应用程序中的用户身份验证/授权被认为是“最佳实践”?

7
我有一个.NET富客户端(WPF)应用程序,将同时在3个不同的场景中部署:
1. 客户端和服务器代码在单个进程中运行 2. 客户端代码在Intranet计算机上运行,并通过WCF与运行应用程序/领域/基础结构代码的服务器计算机通信 3. 与#2相同,但客户端可以在防火墙外的计算机上运行。自定义用户和角色列表应该集中维护(即凭据不基于Windows登录)
对于这个应用程序,实现相同的用户授权/身份验证模型的简单而可靠做法是什么?即使应用程序如何部署,我都希望在我的表示层、应用程序层、领域层等方面采用同样的方法。
我的SQL数据库应该明确地维护用户/角色吗?应该使用Thread.CurrentPrincipal来授权某些应用程序功能所需的代码,还是应该注入依赖项IUserService
由于这是一个低调的应用程序,安全性并不是非常重要 - 只需要一些基本的安全措施。
感谢!
编辑
经过数小时WIF/声明为基础的身份验证研究,我仍然看不到任何关于如何创建独立的.NET桌面应用程序的指导,该应用程序采用这种类型的安全性。所有讨论都针对ASP.NET或WCF。我需要我的应用程序使用标准方法,在分布式(WCF)和独立部署场景中都可以使用。

请了解基于声明的身份验证和基于声明的授权。这是.Net框架的一部分。 - David Brossard
谢谢,请查看我的编辑。 - BCA
1
我还没有尝试过这些,但搜索“wpf自定义身份验证”会显示http://social.technet.microsoft.com/wiki/contents/articles/25726.wpf-implementing-custom-authentication-and-authorization.aspx以及具有相同基本内容的页面,例如http://blog.magnusmontin.net/2013/03/24/custom-authorization-in-wpf/。 - Daniel Brose
2个回答

2
一般而言,最好选择基于令牌的身份验证,如JWT。主要原因是它在各种类型的客户端和服务器中具有灵活性。例如,如果将来需要向解决方案添加移动应用程序(IOS、Android等),您可以毫不费力地完成。您还可以使用Restful服务(如WebApi等)增强应用程序。
因此,如果您正在开始项目,我建议您选择基于令牌的身份验证。
请查看以下网址,您可能会发现它们有用:

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中使用基于令牌的身份验证的链接吗?我需要一个能够与我的现有服务器代码集成的东西,该代码依赖于Thread.CurrentPrincipal模型,并使用自定义IPrincipal实现。我不清楚所有这些通信/令牌的内容是如何映射到线程的IPrincipal,以便代码可以进行授权要求。 - BCA
1
不用谢。请看这个链接:http://www.codeproject.com/Articles/1005485/RESTful-Day-sharp-Security-in-Web-APIs-Basic - akardon
谢谢 - 看起来那里有大量的优秀信息。有一件事不太清楚:那篇文章讨论了“基于令牌的身份验证”,但是它是否特指JWT呢? - BCA
1
这是一个关于如何应用基于令牌的身份验证的通用主题,但是无论JWT(Java Web Token)只是一种令牌格式,您都可以使用相同的过程来使用JWT。 - akardon

1

请看这个。我认为这就是你要找的:

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;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接