我有一个 ASP.NET 应用程序,它动态创建一个 ICS 日历(使用 DDay.iCal 库),我可以从 Outlook 中订阅它。一切正常,但我需要能够保护日历,以便只有经过身份验证的用户才能访问它。即,当您将 URL 添加到 Outlook 中的日历时,它需要询问用户名和密码。
记住 The Milk 似乎已经实现了我需要的东西,但我似乎找不到任何关于如何自己实现这一目标的信息?
我有一个 ASP.NET 应用程序,它动态创建一个 ICS 日历(使用 DDay.iCal 库),我可以从 Outlook 中订阅它。一切正常,但我需要能够保护日历,以便只有经过身份验证的用户才能访问它。即,当您将 URL 添加到 Outlook 中的日历时,它需要询问用户名和密码。
记住 The Milk 似乎已经实现了我需要的东西,但我似乎找不到任何关于如何自己实现这一目标的信息?
克里斯作为评论提供的文章就是解决方案。
需要的是绕过某些请求的表单身份验证,并改用基本 HTTP 身份验证。然后 Outlook(以及可能的其他代理,如 Web 浏览器)支持此功能。
这是通过使用MADAM Http Module实现的。
脚步:
1> 阅读文章以获得基本的了解。
2> 安装 MADAM NuGet 包:PM> Install-Package madam
3> 实现你自己的IUserSecurityAuthority:
例如
public class MadamUserSecurityAuthority : IUserSecurityAuthority
{
public MadamUserSecurityAuthority()
{
}
//This constructor is required
public MadamUserSecurityAuthority(IDictionary options)
{
}
public object Authenticate(string userName, object password, PasswordFormat format, IDictionary options, string authenticationType)
{
if (_yourAuthenticationService.isValid(userName, password.ToString()))
return true;
//Returning null means the authentication failed
return null;
}
public string RealmName
{
get { return "MADAM"; }
}
}
4> 将以下内容添加到您的网络配置中:
例如:
<sectionGroup name="madam">
<section name="userSecurityAuthority" type="System.Configuration.SingleTagSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<section name="formsAuthenticationDisposition" type="Madam.FormsAuthenticationDispositionSectionHandler, Madam"/>
</sectionGroup>
<madam>
<formsAuthenticationDisposition>
<discriminators all="true">
<discriminator inputExpression="Request.Url" pattern="Calendar\.aspx" type="Madam.RegexDiscriminator"/>
</discriminators>
</formsAuthenticationDisposition>
<userSecurityAuthority realm="MADAM" provider="YourAppAssembly.MadamUserSecurityAuthority, YourAppAssembly"/>
</madam>
<httpModules>
<add name="FormsAuthenticationDisposition" type="Madam.FormsAuthenticationDispositionModule, Madam"/>
<add name="AuthenticationModule" type="Madam.BasicAuthenticationModule, Madam"/>
</httpModules>
注1:
<discriminator inputExpression="Request.Url" pattern="Calendar\.aspx" type="Madam.RegexDiscriminator"/>
...用于识别哪些请求应该绕过表单身份验证并使用基本的 HTTP 身份验证,这是使用 Regex 完成的,您可以添加多个鉴别器。
笔记2:
<userSecurityAuthority realm="MADAM" provider="YourAppAssembly.MadamUserSecurityAuthority, YourAppAssembly"/>
....是您配置自定义身份验证提供程序的位置(即您检查数据库凭据的位置)。