OAuth的一个.NET开源实现
从编译DotNetOpenAuth中学到的程序集强签名知识
OAuth的一个.NET开源实现,官方网站:http://dotnetopenauth.net/ 。
从GitHub签出DotNetOpenAuth的源代码发现最新版本已到5.1,而NuGet中发布的版本只是4.3。新版中使用到了.NET 4.5的异步特性(async, await),于是决定直接用最新版。
用最新版,就要自己进行编译。用Visual Studio 2012打开解决方案文件进行编译,一次编译成功,但编译出的DotNetOpenAuth相关dll有20个,这么多dll引用起来不方便。发现DotNetOpenAuth提供了msbuild的配置文件,可以在编译时自动将dll文件进行合并(使用了ILMerge)。于是改用msbuild命令进行编译。
2. 用msbuild进行第一次编译
2.1. 使用的是DotNetOpenAuth的tools\drop.proj编译配置文件,为了加快编译速度,注释了下面的内容:

<!--<ItemGroup>
<ProjectsToBuild Include="$(ProjectRoot)samples\samples.proj">
<Properties>TargetFrameworkVersion=v4.5</Properties>
</ProjectsToBuild> --><!-- Sandcastle doesn't seem to be able to handle .NET 4.0 dependencies right now. --><!--
<ProjectsToBuild Include="$(ProjectRoot)doc\doc.proj">
<Properties>TargetFrameworkVersion=v4.5</Properties>
</ProjectsToBuild>
</ItemGroup>-->

2.2. 运行VS2012的命令行:Developer Command Prompt for VS2012
2.3. 运行msbuild命令:
msbuild tools/drop.proj
2.4. 编译成功

2.5. 在drops\v4.5\Debug文件夹中得到合并后的DotNetOpenAuth.dll。
3. 测试已编译的DotNetOpenAuth
3.1. 在另外的项目中引用已编译出的DotNetOpenAuth.dll
3.2. 编译后运行项目,出现错误提示:
Could not load file or assembly 'DotNetOpenAuth' or one of its dependencies. Strong name signature could not be verified. The assembly may have been tampered with, or it was delay signed but not fully signed with the correct private key. (Exception from HRESULT: 0x80131045)
从这个错误信息中可以解读出:需要对DotNetOpenAuth进行强签名。
4. 使用强签名进行msbuild编译
4.1. 生成公钥
生成公钥需要借助sn.exe(sn是Strong Name的缩写),它是Visual Studio/Windows SDK中自带的一个工具。运行sn.exe命令需要进入Developer Command Prompt for VS2012。
具体操作步骤如下:
4.1.1. 生成密钥对(公钥/私钥)并保存至.pfx文件中
sn -k mykeyfile.pfx
4.1.2. 将密钥对从文件安装至密钥容器中
sn -i mykeyfile.pfx mykeycontainer
4.1.3. 从存放密钥对的.pfx文件中导出公钥至.pub文件
sn -p mykeyfile.pfx mykeyfile.pub
4.1.4. 显示.pub文件中存放的公钥
sn -q -t mykeyfile.pub
4.2. 使用生成的公钥进行msbuild编译
msbuild /p:KeyPairContainer=mykeycontainer,PublicKeyFile="<full path>mykeyfile.pub" tools/drop.proj
4.3. 编译成功
5. 测试已进行强签名编译的DotNetOpenAuth
原以为问题到此就解决了,哪知测试结果出人意料——同样的错误!。。。后来恍然大悟,不放在GAC中,强签名怎么会起作用呢?
6. 将DotNetOpenAuth注册到GAC
6.1. 进入Developer Command Prompt for VS2012命令行
6.2. 运行gacutil命令:
gacutil /i DotNetOpenAuth.dll
6.3. 却出现错误提示:
Failure adding assembly to the cache: Strong name signature could not be verified. Was the assembly built delay-signed?
6.4. 解决方法——用sn命令忽略对强签名进行验证:
sn -Vr *,<之前创建的公钥>
6.5. 然后再运行gacutil,注册就成功了。
Assembly successfully added to the cache
7. 测试已注册至GAC的DotNetOpenAuth
7.1. 本以为到这里应该大功告成了。。。可是在VS2012中添加引用时,在Assemblies中怎么也找不到DotNetOpenAuth。

DotNetOpenAuth不是已经注册到GAC中了吗?Assemblies不就是GAC中的assemblies吗?
7.2. 搜索网上的资料才了解到Visual Studio添加引用时的Assemblies与GAC一点关系没有,GAC是.NET程序运行时用到的东西,而且这里的assemblies只是VS专用的一个存放程序集的文件夹。可是我以前一直以为它显示的就是GAC中的程序集。是因为我的愚蠢呢,还是因为微软反直觉的设计?即使前者,好的设计应该——别让用户发呆(推荐阅读别让用户发呆——设计中的防呆策略)。
8. 问题解决
按通常的做法,在VS中添加引用时,选择Browse,选择DotNetOpenAuth.dll所存放的文件路径,点击OK。成功引用之后,编译/运行项目,就大功告成了。你会发现,已经在GAC中注册过的程序集,添加引用时,VS将自动将Copy Local属性设置为False;否则为True。这就是程序集在与不在GAC中的一个区别之处。

9. 参考资料
https://github.com/DotNetOpenAuth/DotNetOpenAuth/wiki/ContributorQuickStart
OAuth的一个.NET开源实现的更多相关文章
- 【通信】Netty JBOSS提供的一个java开源框架
Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序dsf. 也就是说,Netty 是一个基 ...
- 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...
- Akka.NET是Java/Scala 流行框架Akka的一个 .NET 开源移植
Akka.NET v1.0 已发布,支持Mono Akka.NET 是Java/Scala 流行框架Akka的一个 .NET 开源移植.可用于构建高并发,分布式和容错事件驱动的应用在 .NET 和 M ...
- 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore
大家好 , 我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 , 名字叫 HtmlCore . 项目的一个主要目标是可以用 .Net 在 移动设备 上 开发 GUI 程序 (界面程 ...
- 我发起了一个 .Net 开源 数据库 项目 SqlNet
大家好 , 我发起了一个 .Net 开源 数据库 项目 SqlNet . 项目计划 是 用 C# 写一个 关系数据库 . 可以先参考我之前写的 2 篇文章 : 谈谈数据库原理 https://w ...
- 如何参与一个GitHub开源项目?
如何参与一个GitHub开源项目? 摘要:本文是Github官如何参与一个GitHub开源项目方给出的参与Github上开源项目的一些指导,对希望加入开源社区的开发者是一个不错的参考. 最近一年开源项 ...
- go语言的一个gui 开源 项目 https://github.com/andlabs/ui
go语言的一个gui 开源 项目 https://github.com/andlabs/ui 1 安装 mingw-w64 链接地址: http://mingw-w64.sourceforge. ...
- Spring 社区的唯一一个国产开源项目 - Spring Cloud Alibaba 毕业了
阿里妹导读:一年多前,Java 界最近发生了一件大事,阿里开源 Spring Cloud Alibaba,并推出首个预览版.Spring Cloud 本身是一套微服务规范,并不是一个拿来即可用的框架, ...
- 自己第一个github开源的感受
自己在github上发布了开源<基于IOS的手机视频直播SDK>后,不到一个月,被人star了508次,fork了120次,这个成绩大大出乎了我自己的意料! github网址:https: ...
随机推荐
- Delegate,Action,Func,Predicate的使用与区别
C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...
- js中,(function(){})()的用法解析
(function($){...})(jQuery) 含义 经常用,今天总结一下,下文摘自某网友的总结: (function($){...})(jQuery)实际上是匿名函数,不懂得朋友可以继续往下 ...
- 【Python】Python与文本处理langid工具包的文本语言检测和歧视
1.问题的叙述性说明 使用Python文本处理.文字有时被包括中国.英语.在日本和其他语言文字,进行处理.这个时候就须要判别当前文本是属于哪个语系的. Python中有个langid工具包提供了此功能 ...
- 针对不同手机系统的LBS地图定位解决方案
原文:针对不同手机系统的LBS地图定位解决方案 摘要: 针对目前的三种手机系统:Android安卓.S60塞班.IOS苹果,做出的三种不同的手机地图应用解决方案. 查阅了多数地图API对手机的支持情况 ...
- IOS、java支持DES加密
转载请注明博客地址:http://blog.csdn.net/mengxiangyue/article/details/40015727 近期在考虑数据加密方面的需求,所以对数据加密简单的看了一下,当 ...
- oracle删除重复记录,只保留rowid最小的记录
初探oracle删除重复记录,只保留rowid最小的记录 如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种 ...
- PyCharm 使用简介
PyCharm 使用简介 最近由于项目需要,领导要求使用python以方便扩展,没有办法,赶鸭子上架花了2天时间翻完了python的初级教程然后就开始写代码.有一款好的IDE可以帮助我快速上手一门新语 ...
- iOS程序发布时出现your application is being uploaded解决办法
当用Xcode发布app时候出现“your application is being uploaded”或者用Application Loader 一直出现“ 正在通过ITUNES STORE进行鉴定 ...
- sql级联删除
原文:sql级联删除 功能:在删除主表时,自动删除副表(外键约束)相应内容 删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用.在级联删除中,还删除其外键值引用删除的主键值的所有行. 如: ...
- JS全选功能代码优化
原文:JS全选功能代码优化 JS全选功能代码优化 最近在看javascript MVC那本书,也感觉到自己写的代码也并不优雅,所以一直在想 用另一种模式来编写JS代码,所以针对之前的简单的JS全选功能 ...