c# – 如何在针对AzureAD的.net 4.5中实现SAML2身份验证? (消费代币)
作者:互联网
我想允许对我的Web应用程序进行SAML身份验证,包括针对AzureAD作为身份提供程序以及ADFS. (任何人都可以指点我一个很好的教程或演练吗?)我已经生成SAML请求,从AzureAD获取SAMLP响应,并验证其签名(包括事实它是SHA256不起作用)默认情况下).
现在,我想从中提取信息以验证发行者并获取用户的电子邮件以识别它们.通过XML手动执行此操作是“可以”还是应该使用类似Saml2SecurityTokenHandler的类?他们看起来应该这样做,但我发现很难理解所需的所有配置,以及从安全角度来看是否有必要使用这些类.
我的应用程序是多租户,所以我想要代码而不是配置来处理Saml,因为不同的租户将使用不同的身份验证选项.
This blog表示不使用ConfigurationBasedIssuerNameRegistry,而是指向[ValidatingIssuerNameRegistry] [3].好的,这似乎适合我的场景.
在this question中有一些代码以编程方式配置受信任的颁发者,因此我可以调整为使用ValidatingIssuerNameRegistry,然后我可以使用tokenHandlers从SAMLP响应中读取Assertion,然后提取包括Name(电子邮件)在内的声明.但是我在哪里可以获得指纹&从AzureAD元数据传递给它的名称?确切地说,使用这些类而不是自己解析响应的价值是什么?这绝对感觉就像使用图书馆这样做是正确的,但WIF的复杂性以及缺乏关于这样做的漫画文章使得它感觉不合适的东西除了那些身份世界的深处.
我的猜测是,如果我已经在本地存储了证书以验证SAML响应的发布者的身份,并且我在XML中验证签名,那么我可以愉快地使用SAML响应的内容.即用户的身份.尽管如此,手动执行此操作仍然是错误的方法,但如果没有明显的缺点,我也可以.
一些相关的SO问题&文章:
> How to convert SAML XML token string to either SecurityToken or ClaimsPrincipal instance?
> web.config convert saml security token to claim principal
> Working with SAML 2.0 in C# .NET 4.5
> http://www.cloudidentity.com/blog/2013/03/25/a-refresh-of-the-identity-and-access-tool-for-vs-2012/
解决方法:
正如您所发现的那样 – 即使支持SAML2令牌,.NET中也没有针对SAML2协议的内置支持.
我建议您查看SAML2P for ASP.NET的可用开源和商业库,而不是自己动手.在.NET框架中提供的功能之上构建可靠的服务提供程序有很多工作要做. (我知道,因为我已经建立了一个,如果我知道我现在所知道的,我不认为我会再做一次).
如果您选择继续自己,Saml2SecurityTokenHandler包含从XML读取断言的重要工具,将它们转换为声明身份并验证断言上的签名.请注意,处理程序希望对断言进行签名 – AFAIK没有内置支持来处理签署整个SAML响应的情况(也包括嵌入的断言).
使用Kentor.AuthServices
此处描述的方案是直接使用Kentor.AuthServices API,这是一种不推荐作为首选的高级方案.对于Web API和现代MVC应用程序,使用Kentor.AuthServices.Owin包中的Owin中间件要好得多.
这里的代码使用的是Kentor.AuthServices.HttpModule包中的API.
配置
要直接使用AuthServices API,首先必须创建配置,如docs中所述.可以在代码和web.config中同时执行.对于此示例,我将仅引用一个Options属性,它是一个IOptions实例.它可以通过Options.FromConfiguration属性从web.config加载.
发送AuthnRequest
身份验证的第一步是发送AuthnRequest. dummyUrl只是任何非null的Uri对象.它不会在此方案中使用,但不允许为null.
var idp = Options.IdentityProviders.Default;
var urls = new AuthServicesUrls(fullUrlOfYourAcsService, dummyUrl, applicationUrl);
var authnRequest = idp.CreateAuthenticateRequest(dummyUrl, urls);
// Apply will call Response.End
idp.Bind(authnRequest).Apply(new HttpResponseWrapper(HttpContext.Current.Response));
即使OP已经成功完成了这项工作,也必须通过AuthServices来正确注册待处理的请求,然后将其与返回的响应进行匹配.
收到回复
下一步是接收返回的SAML2Response.此代码应位于发送AuthnRequest时指定的“fullUrlOfYourAcsService”位置.
var result = CommandFactory.GetCommand(CommandFactory.AcsCommandName)
.Run(new HttpRequestWrapper(HttpContext.Current.Response), Options);
// result.Principal will now contain the received identity.
标签:c,net,wif,saml-2-0 来源: https://codeday.me/bug/20190516/1116045.html