我们使用 OAuth 2.0 从 Azure AD 获取 JWT 令牌。在我们的应用程序中,我们使用“upn”声明的值来识别关联的内部用户名。
Azure AD 令牌参考将upn声明记录为“用户主体名称”,据我所知,这是遵循 addr-spec 格式的用户名(即 user@domain)。这对于在 Azure AD 租户中创建的用户非常有效。然而,令我惊讶的是,如果经过身份验证的用户从不同的 AD 同步,则upn声明似乎消失了。这种行为似乎没有在任何地方记录。
我想绝对确定我们的应用程序能够处理 Azure AD 颁发的所有令牌,因此我对于使用上述任何声明都犹豫不决,除非我有一些文档可以解释其实际语义。
假设我想为整数列表声明一个简单的代数数据类型:
sealed class IntList
data class Cons(val head: Int, val tail: IntList): IntList()
data class Nil() : IntList()
Run Code Online (Sandbox Code Playgroud)
但是,最后一个声明会导致错误
数据类必须至少有一个主构造函数参数
是否有可能表达无需构造函数而无需编写大量的样板代码?如果我将最后一个声明更改为类似的
sealed class Nil() : IntList()
Run Code Online (Sandbox Code Playgroud)
然后我失去了免费的实现hashCode()和equals()免费data class声明.
编辑
Alex Filatov给出了一个很好的简短解决方案.显然,您永远不需要多个实例Nil,因此我们可以只定义一个单例对象
object Nil : IntList()
Run Code Online (Sandbox Code Playgroud)
但是,如果我们的列表由类型参数参数化,我们会怎么做?也就是说,现在我们定义的前两行是
sealed class List<A>
data class Cons<A>(val head: A, val tail: List<A>): List<A>()
Run Code Online (Sandbox Code Playgroud)
我们不能声明Nil从List<A>any 派生的多态单例对象A,因为我们必须A在声明时提供具体类型.解决方案(取自这篇文章)是声明A为协变类型参数并声明为如下Nil的子类型List<Nothing>:
sealed class List<out A>
data …Run Code Online (Sandbox Code Playgroud) 在我的ASP.NET应用程序中,我使用LoadControl动态加载.ascx,使用以下模式:
var ctrl = LoadControl("/path/to/control.ascx");
((ControlType)ctrl).SomeProperty = someData;
placeholder.Controls.Add(ctrl);
Run Code Online (Sandbox Code Playgroud)
我添加的控件将SomeProperty属性值直接保存到ViewState,如下所示:
public int? SomeProperty
{
get { return (int?)ViewState["SomeProperty"]; }
set { ViewState["SomeProperty"] = value; }
}
Run Code Online (Sandbox Code Playgroud)
在那之后,ascx控件独自生活,一切都很好,直到回发发生.当页面回发时,突然视图状态为空!我怀疑这是因为我在将实例化的ascx添加到我的页面之前操纵了ViewState.此外,我可以通过在Page_Load()我的ascx控件的方法中添加以下行来防止ViewState丢失:
SomeProperty = SomeProperty;
Run Code Online (Sandbox Code Playgroud)
我必须为每个属性执行上述操作以确保保留ViewState.现在,有更好的方法吗?在将实例化的.ascx添加到页面后操作ViewState不是一个选项 - 我需要Page_Init()和Page_Load()方法中的ViewState的内容,这是在我将.ascx添加到我的页面时触发的.
谢谢.