Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在运行时更改成员资格提供程序ApplicationName。怎么用?_C#_Asp.net_Asp.net Mvc_Security - Fatal编程技术网

C# 在运行时更改成员资格提供程序ApplicationName。怎么用?

C# 在运行时更改成员资格提供程序ApplicationName。怎么用?,c#,asp.net,asp.net-mvc,security,C#,Asp.net,Asp.net Mvc,Security,我在这里有一个独特的情况。我正在制作一个web应用程序,它将 能够使用不同的web应用程序凭据登录。例如,您可以登录/注册我的网站,也可以登录/注册YouTube帐户。我没有使用OpenID,因为在这种情况下我需要访问YouTube的数据 我正在使用ASP.NET MVC 3 EF4和自定义成员资格、角色、配置文件提供程序 问题是用户名不能是唯一的,因为具有YouTube用户名的人可能与在我的网站注册的人具有相同的用户名。因此,我在用户表中指定了一个用户类型。这几乎是一个复合键(用户id和用户类

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

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

问题是用户名不能是唯一的,因为具有YouTube用户名的人可能与在我的网站注册的人具有相同的用户名。因此,我在用户表中指定了一个用户类型。这几乎是一个复合键(用户id和用户类型)

我有一个自定义authorize属性,用于检查用户所处的角色,但现在我需要实现一个自定义IPrincipal,因为我需要传递一个用户类型。唯一的问题是我应该把它存放在哪里?会议

起初,我认为这就是应用程序表的用途,我在这方面取得了暂时的成功,但读到有线程问题,我发现到处都有会话错误,这不是很好:(

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

编辑: 我基本上需要有能力在运行时按专业语法更改应用程序名。我尝试过这样做,唯一的问题是当我停止开发服务器,但保持浏览器打开,然后再次运行开发服务器时,它不会保留应用程序名

编辑: 我已将应用程序更改为使用OAuth,但我从未找到好的解决方案。

Ryan

嗯……你能通过在用户名字段前面加上颁发机构(本地或YouTube)来解决这个问题吗……例如用户名:“local/corlettk”、“YouTube/corlettk”

好的,您将需要一个自定义验证器来拆分复杂的字符串,并将登录请求传递给相应的底层验证器……但一旦完成,我想,您就可以轻松地处理更大的授权问题(从您的角度来看)

我觉得你是个聪明人……你考虑过并放弃这种方法了吗

干杯,基思

PS:是的,我是一个黑客……但我有一个坏习惯,就是把有用的东西黑客掉……所以他们已经放弃了教育我

我基本上需要有这个能力 要在更改应用程序名称,请执行以下操作: 运行时专业语法。我试过了 这样做,唯一的问题是什么时候 我停止了我的开发服务器,但是 让我的浏览器保持打开状态,然后运行我的开发 服务器,它不会保留 应用程序名称

如果需要更改ApplicationName,这意味着您需要在运行时选择一个提供程序。 唯一的方法是不要使用单例“成员资格”,因为它使用web.config中定义的提供程序

而是在每次需要提供商时使用:

MembershipProvider userProvider = Membership.Providers[UserProviderName];

只需按您想要的方式设置UserProviderName。我会使用自定义全局授权或预操作筛选器,该筛选器从某个cookie或其他会话变量检测提供程序,并将提供程序放入HttpContextBase.Items集合中,该集合仅用于一个请求。

此问题的最佳答案是在StackOverv上回答在这里:

以下是他们使用的代码:

Membership.Providers["MyOtherProvider"].ValidateUser(username, pwd);

是的,我已经想到了这一点,但是如果我需要基于用户类型的页面,那么现在我必须检查用户名字段并拆分字符串?Hmmmm…
if(username.StartsWith(“LOCAL/”)
对我来说并不是什么大不了的事?但如果你发现自己到处都在这样做,那么也许是时候把它考虑到你的继承树中了。
LocalUser扩展User
YouTubeUser扩展User
,这样每个会话都会做一次这个小决定。(是的,我是一个Java爱好者。)如果做不到这一点……伙计,你现在的工作就差不多完成了。你需要一个
IPrinciple.IsInRole
的自定义实现,它使用
IDomainIdentity扩展IIdentity
…是的,我想
凭证是会话的“自然属性”。至少我觉得它“感觉不错”(但我对MVC3了如指掌)。我很想听听真正的专家怎么说。我认为有更好的抽象。重载用户名的含义/值/意图是一个坏主意。一般来说,重载任何字段的含义都是一个坏主意。我喜欢这个解决方案。这允许每个“授权”配置略有不同(例如不同的超时)如果需要的话。好主意!这个解决方案唯一的缺点是MembershipProvider提供了一些MembershipProvider没有的真正有用的静态方法。所有的功能都在那里,只是成员身份更容易使用。你是对的,基本提供程序非常基本。你的应用程序处于5%的不正确支持状态by框架。问得好。我过去也曾这样做过,只有1/2的人喜欢我创建的解决方案。当我从妻子那里拿回我的电脑时,我会给你看一些代码。:)