在运行时更改成员资格提供程序ApplicationName.怎么样?

Rya*_*yan 7 c# asp.net security asp.net-mvc

我这里有一个独特的情况.我正在制作一个能够使用不同的Web应用程序凭据登录的Web应用程序.例如,您可以登录/注册我的网站,或者您可以登录/注册您的YouTube帐户.我没有使用OpenID,因为在这种情况下我需要访问YouTube的数据.

我正在使用ASP.NET MVC 3 EF4与自定义成员,角色,配置文件提供程序.

问题是用户名不能是唯一的,因为拥有YouTube用户名的人可能与在我的网站上注册的用户具有相同的用户名.所以我通过在用户表中指定用户类型来解决这个问题.这几乎是一个复合键(用户ID和用户类型).

我有一个自定义authorize属性,正在检查用户所在的角色,但现在我需要实现自定义IPrincipal,因为我需要传递用户类型.唯一的问题是我在哪里存储?会议?

最初我认为这是应用程序表的用途,并且我暂时取得了成功,但是读到了线程问题,而且我在整个地方遇到会话故障并不是那么好:(

我想知道最好的方法是什么,因为我不能在提供程序中使用重写的方法,因为我必须在某些方法中添加UserType参数,但这会破坏提供程序的功能.

编辑:我基本上需要能够在运行时以编程方式更改ApplicationName.我尝试这样做,唯一的问题是当我停止我的开发服务器但打开浏览器然后再次运行我的开发服务器它不会保留应用程序名称.

编辑:我已经改变我的应用程序使用OAuth,我从来没有找到一个很好的解决方案.

Sof*_*ion 5

我基本上需要能够在运行时以编程方式更改ApplicationName.我尝试这样做,唯一的问题是当我停止我的开发服务器但打开浏览器然后再次运行我的开发服务器它不会保留应用程序名称.

如果需要更改ApplicationName,则表示需要在运行时选择提供程序.唯一的方法是不使用单例"Membership",因为它使用web.config中定义的提供程序.

相反,每次您需要提供者使用时:

MembershipProvider userProvider = Membership.Providers[UserProviderName];
Run Code Online (Sandbox Code Playgroud)

只需按照您想要的方式设置UserProviderName即可.我会使用自定义全局授权或preAction过滤器,它从某些cookie或其他会话变量中检测提供程序,并将提供程序放在HttpContextBase.Items集合中,该集合仅适用于一个请求.


cor*_*ttk -1

瑞安,

嗯...您可以通过在用户名字段本身前面添加颁发机构(本地或 YouTube)来解决该问题吗...示例用户名:“LOCAL/corlettk”、“YOUTUBE/corlettk”???

好吧,您需要一个自定义的身份验证器来分割复杂的字符串,并将登录请求轻拂到适当的底层身份验证器...但是一旦完成,(我猜)您就可以轻松处理了更大的问题(从你的角度来看)是授权。

我认为你是一个聪明人...你已经考虑过并拒绝了这种方法吗?

干杯。基思.

PS:是的,我是一名黑客...但我有坏习惯,喜欢破解有用的东西...所以他们放弃了教育我。