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: ...
随机推荐
- xcode于Archive当产生安装包遇到ld: library not found for -lPods
此问题是由能力很困扰,通常有以下几个方案 进target的 Build Phases- Link binary Library.到场libPods.a,假设是红.删,能够 其他解决方案 Build S ...
- 经Apache将tomcat转用80port这两个域名
一般用tomcat通告Java web项目采用www.xxx.com:8080/appname/xxxservlet要访问一个简单的服务,这会'暴漏'应用程序名称(当然,你也可以摆脱),它看起来并不规 ...
- 经典Loading 动漫赏析
0. 传统的菊花Loading动画 假设作为程序猿的你还在用菊花作为Loading动画,是时候换个口味了.来看下5种不错的Loading动画. 几种颜色组成的动画,给用户一个美感. 1.android ...
- 在Cocos2d-x正在使用SQLlite数据库
SQLite,它是一个轻量级的数据库,合规ACID的关系型数据库管理系统,它的设计目标是嵌入式的,并且眼下已经在非常多嵌入式产品中使用了它,它占用资源非常的低.在嵌入式设备中,可能仅仅须要几百K的内存 ...
- js 上一天、下一天
function Previousday() { var curDate = new Date(CreateDate_Temp); * * * ); var strDate = preDate.get ...
- 使用Canvas基于手势可以使树秋千
用Canvas制作能够依据手势摆动的树 依据工作的须要.制作一个摆动的树做为页面的背景.为了添加页面的交互性,我又为背景中的树添加了鼠标(触控)事件,使他可以依据鼠标(触控)做出对应的动作,当手指做上 ...
- iOS_23_undress Girl
最后效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill ...
- ios背景更新和下载
ios背景更新和下载 by 吴雪莹 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS ...
- 过度补脑系列:Nokia的不归路
没有数据,没有调查,只是突然想起诺基亚... 23号的一节酱油课,脑海中突然闪过两个关键字--nokia & android 于是用手机百度了一下,竟然真的出了新机型,NokiaX,X东24日 ...
- C语言移位运算
移位运算有两种:>>(右移),<<(左移). a>>b表示将a的二进制值右移b位. a<<b 表示将a的二进制值左移 b位.要求 a和 b都是整型, b ...