目录

介绍

背景

使用代码


  • 下载源文件276.9 KB

介绍

在这里,在本文中,我创建了一个简单的WPF应用程序,该应用程序尝试使用默认网络凭据针对WebApi服务对用户进行身份验证。如果成功,将为将来的所有webapi请求存储该文件。如果失败,则我们将显示一个登录窗口以捕获凭证,并在成功认证后将其保存以备将来使用。它还使用凭据管理器软件包将凭据存储在系统上。

背景

在当今的微服务体系结构世界中,所有业务逻辑都驻留在服务中。即使是古老的WPF桌面应用程序也不会受到影响。解决方案朝着WPF桌面应用程序包含表示和数据验证逻辑的方向发展。在后端,它与需要使用身份验证和授权框架进行保护的Web API进行交互。

使用桌面应用程序时,通常的首选项是使用默认的Windows身份验证。但是在某些情况下,用户可能还希望使用其他凭据。

使用代码

该应用程序是围绕CredentialManagement nuget软件包构建的,该软件包为Windows凭据管理API提供了包装。

逻辑从App.xaml.cs文件开始,我们在构造函数中调用CreateHttpClientHandler。CreateHttpClientHandler是HttpClientFactory中的static方法,其使用DefaultNetworkCredentials连接到WebApi。网址可以是任何服务,也可以是专门为测试成功连接而创建的服务。使用单独的API测试连接是一种更好的方法,因为它可以减少应用程序服务器中的负载,还可以防止恶意用户。

HttpClientFactory中特别重要的代码是:

private static async Task<bool> CreateHttpHandlerUsingWindowsDefaultCredentialsAsync(){try{var response = await StoreCredentialsIfDomainControllerIsAccessibleAsync(CredentialCache.DefaultNetworkCredentials, false);if(!response.IsSuccessStatusCode){//server responds but windows credential cannot loginif(response.StatusCode==HttpStatusCode.Unauthorized){return false;}}return true;}catch(Exception e){if (e.InnerException is WebException webException){if (webException.Response is HttpWebResponse webResponse){if (webResponse.StatusCode == HttpStatusCode.Unauthorized)return false;}}throw;}}public static async Task<HttpResponseMessage> StoreCredentialsIfDomainControllerIsAccessibleAsync(NetworkCredential credentials, bool rememberCredentials){var uriForTestingConnection = $"{BaseAddress}<url for testing connection>";            var httpClient = new HttpClient(new HttpClientHandler { Credentials = credentials });var res = await httpClient.GetAsync(uriForTestingConnection);if (res.IsSuccessStatusCode){                HttpClientFactory hc = Instance;hc.Credentials = credentials;if (rememberCredentials)CredentialUtil.SetCredentials(BaseAddress, credentials.UserName, // store domain and username // in Credential.Usernamecredentials.Password, PersistanceType.Enterprise);elseCredentialUtil.RemoveCredentials(BaseAddress);}           return res;}

对webApi连接的测试是在StoreCredentialsIfDomainControllerIsAccessibleAsync方法中完成的,该方法将默认网络凭据添加到HttpClientHandler并调用Get方法。如果响应是Success代码,则使用CredentialUtil类存储凭据。这些WebApi调用被包装在Try Catch块中,以处理webApi可能关闭的情况,因此返回不成功的状态代码。

CredentialUtil是围绕CredentialManagerNuget包的包装,其存储在封装UserName和Password映射到基本URL。它包含用于存储、检索和删除密码的方法。

public static class CredentialUtil{public static string GetPasswordIfRemembered(string target){var cm = new Credential {Target=target };cm.Load();return cm.Password;}public static string GetUserNameIfRemembered(string target){var cm = new Credential { Target=target};cm.Load();return cm.Username;}public static bool SetCredentials(string target, string username, string password, PersistanceType persistenceType){return new Credential{Target = target,Username = username,Password = password,PersistanceType = persistenceType}.Save();}public static bool RemoveCredentials(string target){return new Credential { Target=target}.Delete();}}

如果使用默认的网络凭据登录失败,则会加载“登录对话框”。用户可以提供其凭据来访问该服务,该服务在经过验证后将加载主应用程序页面。在随附的示例中,使用MVVMLight框架完成Login视图的加载。

我已经附上了实现解决方案,该解决方案需要进行配置以更新有效的Api Urls /端点。

WPF:使用WPF应用程序中的默认网络凭据和凭据存储来管理自动登录相关推荐

  1. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

  2. php 清除浏览器记住密码,网页登录中实现记住用户名和密码的功能(完成自动登录)...

    网页记住用户名,就是我们经常会用到的,登录下面有一个复选框,可以设置用户7天内或1个月不需要登录,只要你进行本网站系统查询cookie是否有相差用户名与密码如果是就把信息提取再到数据库中查询,如果co ...

  3. boke | 前后端分离中使用JWT保持前端数据的持久化,并自动登录

    在boke后台登录系统中实现了自动登录的功能,这也是前后端分离的开发模式中最常见的一个问题,如何保持登录状态的持久化.今天就来通过实现自动登录来一步步理清前端数据持久化的思路. 一 实现思路 当用户首 ...

  4. 在VS2010开发的MVC3 应用程序中设定默认的浏览器

    vs2010做mvc3 开发,用的是Razor的View,想修改默认浏览器,发现右键没有"浏览方式",把View改成.aspx的,也没有找到这个选项. 解决方法两种 (1)最简单的 ...

  5. android 程序中设置默认输入法

    String key = Settings.Secure.DEFAULT_INPUT_METHOD;//"default_input_method" String id = &qu ...

  6. linux c程序中内核态与用户态内存存储问题

    Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件--控制计算机的硬件资源,并提供上层应用程序运行 ...

  7. 自定义小程序中的showToast

    对于小程序自己提供的showToast,大家是不是觉得挺好用的,但是当我们遇到需要提示的信息字数较多时,因为小程序中showToast默认只能显示7个字体长度,因此对于多余的字数会隐藏,这样是不是很烦 ...

  8. 在Delphi程序中调用控制面板设置功能

    ====================================================== 注:本文源代码点此下载 ================================= ...

  9. 微信小程序中自定义导航和地图定位

    在健康码中,主要的难点技术就是在小程序中定位.自定顶部导航. 自定义导航 在微信小程序中,默认的顶部导航不能设置图片背景或者是透明背景,只能自定义导航. 在每一个页面中引入,就是得到自己定义[个性化的 ...

最新文章

  1. 原生js实现触摸滚动轮播图
  2. Websocket总结
  3. C/C++ 中生成特定范围内的随机数
  4. python基础--面向对象之多态
  5. Mac OS上用item2连接CentOS7
  6. linux用xshell编辑文件,Linux远程管理器xshell和xftp使用教程
  7. 如何安装使用MinDoc搭建个人在线wiki文档
  8. 80-040-000-原理-MySQL的 ICP
  9. Python学习---基础函数的学习
  10. Dijkstra及其堆优化
  11. OptiSystem 快捷键及使用技巧
  12. 关于火狐插件总结。。。
  13. Microsoft Visual C++ 14.0 网盘下载
  14. 文件系统 fsck和e2fsck使用-小白实操记录
  15. ARM 上电复位过程
  16. Power BI Premium Per User (PPU) 介绍
  17. 移动光纤开通的时候,绑定了mac地址,怎么用路由器连接
  18. 设计模式应用有感总结
  19. 大一微积分笔记整理_大一上学期 高数复习要点整理
  20. 【学术】基金申请体会:写好本子是年轻人的最佳出路(转贴)

热门文章

  1. 原创设计师如何提高影响力?到集设,让你的原创设计作品展示给世界
  2. vue 表格中有列需要异步加载_Vue中使用async/await解决异步请求问题
  3. c++ assert用法
  4. kpatch: dynamic kernel patching
  5. FD.io VPP环境下运行用户应用程序教程
  6. DPDK PMD( Poll Mode Driver)轮询模式驱动程序
  7. server取出多个最小值 sql_SQL汇总查询及分组查询
  8. 安卓日志点击无反应_长生之路游戏原型开发日志(三十七)
  9. Hadoop、spark、Flink、Blink、storm介绍
  10. netty的channel介绍