这个问题是一个结构/设计问题,因为我无法找到执行任务的最佳方法.
在我的MVC应用程序中,我使用DotNetOpenAuth(3.4)作为我的登录信息提供者,只使用FormsAuthenticationcookie 的标准等.
DB中的当前用户表具有:
由于UserId是用户的明确标识符(他们应该能够在以后更改其OpenId提供程序),因此它是其他表链接到(对于用户)的关键.
这是当前代码,在成功身份验证时,会创建临时用户并重定向到"创建操作".
switch (response.Status)
{
case AuthenticationStatus.Authenticated:
FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);
var users = new UserRepository();
if (!users.IsOpenIdAssociated(response.ClaimedIdentifier))
{
var newUser = new DueDate.Models.User();
newUser.OpenIdIdentifer = response.ClaimedIdentifier;
newUser.OpenIdDisplay = response.FriendlyIdentifierForDisplay;
TempData["newUser"] = newUser;
return this.RedirectToAction("Create");
}
Run Code Online (Sandbox Code Playgroud)
现在问题的症结在于:
是否response.ClaimedIdentifier存储了针对用户的正确信息?
是FormAuthentication.SetAuthCookie表单身份验证的首选方法吗?或者,还有更好的方法?
当我调用SetAuthCookie时,除了用户之外没有与用户相关的数据ClaimedIdentifier.如果我一直提到他们UserId,创建用户是个更好的主意,那么将其存储UserId在cookie而不是ClaimedIdentifier?
如果我在很多地方使用UserId,我如何从cookie中检索它,或者将它存储在其他更合乎逻辑/有用的地方?
有点长的啰嗦,但我一直在努力找到最好的方法来做这个/
我意识到这个问题之前已经被问过,但是代码示例的方式很少,所以我再问一次,但至少有一点方向.
经过几个小时的搜索,我得出了以下部分实现.
namespace GoogleAnalyticsAPITest.Console
{
using System.Security.Cryptography.X509Certificates;
using DotNetOpenAuth.OAuth2;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
class Program
{
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
string Scope = Google.Apis.Analytics.v3.AnalyticsService.Scopes.Analytics.ToString().ToLower();
string scopeUrl = "https://www.googleapis.com/auth/" + Scope;
const string ServiceAccountId = "nnnnnnnnnnn.apps.googleusercontent.com";
const string ServiceAccountUser = "nnnnnnnnnnn@developer.gserviceaccount.com";
AssertionFlowClient client = new AssertionFlowClient(
GoogleAuthenticationServer.Description, new X509Certificate2(@"7039572692013fc5deada350904f55bad2588a2a-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable))
{
Scope = scopeUrl,
ServiceAccountId = ServiceAccountId//,ServiceAccountUser = ServiceAccountUser
};
IAuthorizationState state = AssertionFlowClient.GetState(client);
AnalyticsService service = new AnalyticsService(authenticator);
string profileId = "ga:xxxxxxxx";
string …Run Code Online (Sandbox Code Playgroud) 既然idselector已经升级到RPXNow并且你不能"只使用"选择器代码,那么什么是好的替代品呢?
我想在我正在使用的新网站上实现OpenId,但是用户在登录时会非常愚蠢,除非我为他们提供了一种简单的方法.
作为参考,我将使用.Net Open Id作为ASP.Net MVC Web应用程序的后台.
编辑
我试图弄清楚如何在我的webforms应用程序中使用DotNetOpenAuth(http://www.dotnetopenauth.net/)
我不明白从哪里开始.我的Login.aspx上有一个OpenIDSelector,可以让你选择google或Yahoo.您可以选择一个,然后弹出一个弹出窗口,然后让您登录.一旦你登录该程序挂起,因为它试图对数据库做一些事情???
我不能只使用一些控件(比如OpenIDSelector)并获回用户的身份验证,获取他们的ClaimedID并自己处理其余部分吗?
编辑:尝试在Webforms中开始使用OpenID?到这里...
我试图复制Rick在这里为OpenID实现做的事情:http: //www.west-wind.com/weblog/posts/899303.aspx
但是,当我到达这个部分时:
return req.RedirectingResponse.AsActionResult();
Run Code Online (Sandbox Code Playgroud)
然后我无法继续,因为AsActionResult不再存在,有没有替换它?
非常感谢
我在使用DotNetOpenAuth和MVC4为谷歌实现自定义OAuth2Client时遇到问题.
我已经到了可以成功向Google端点发出授权请求的地步 https://accounts.google.com/o/oauth2/auth
谷歌询问用户是否允许我的应用程序访问他们的帐户.到目前为止都很好.当用户点击"确定"时,Google会按预期调用我的回调网址.
问题是当我在OAuthWebSecurity类上调用VerifyAuthentication方法时(Microsoft.Web.WebPages.OAuth)
var authenticationResult = OAuthWebSecurity.VerifyAuthentication(Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl }));
Run Code Online (Sandbox Code Playgroud)
它始终使用IsSuccessful = false和返回AuthenticationResultProvider = ""
我已经查看了这个代码,OAuthWebSecurity类尝试从中获取Provider名称
Request.QueryString["__provider__"]
Run Code Online (Sandbox Code Playgroud)
但谷歌并没有在查询字符串中发回这些信息.我实施的另一个提供商(LinkedIn)正在发回提供商名称,一切正常.
我不知道我从这点可以做,除了抛弃Microsoft.Web.WebPages.OAuth类,只是使用DotNetOpenAuth没有他们,但我希望有人可能有另一种解决方案,我可以试试...
我进行了广泛的搜索,但似乎无法找到任何帮助...我发现很难找到人们做同样事情的例子,这让我感到很惊讶.
任何帮助非常感谢!
我是oAuth地区的新手,并设置了DotNetOpenAuth来建立oAuth服务提供商.DotNetOpenAuth下载中提供的示例对我来说相当混乱......也许我不熟悉这些东西.有一个默认页面可以创建数据库并填充数据库.现在我浏览到login.aspx,它要求我输入一个openid,实际上我想使用DNN(实现DotNetOpenAuth),我想在另一个将成为oAuth消费者的网站上使用这些凭据.有人可以解释如何在DotNetOpenAuth样本中测试oAuth服务提供商吗?
到目前为止,我一直在使用自定义成员资格提供程序进行身份验证.我即将开始使用MVC开发我的第一个网站.我想知道我是否应该使用ASP .NET MVC附带的内置成员资格提供程序,或者我是否应该创建自己的.我的网站需要与openid,facebook,google等集成以进行身份验证和api访问的openauth.我想知道根据我的需要使用内置的那么容易.
我正在编写一个使用MVC4的Web API,应该由多个客户端类型使用.我想使用OpenID进行身份验证.
我已经下载了DotNetOpenAuth NuGet包,但到目前为止所有示例都是针对客户端应用程序而不是API.
我的问题很简单.我想让客户端向我的API发送身份验证请求.API使用OpenID提供程序进行身份验证.然后,API会设置它需要的任何内容,以便在整个Web api调用中使用[Authorize]标记.
我知道在.NET应用程序中,可以调用FormsAuthentication.SetCookie,但这对于其他语言来说也是一个易于实现的解决方案吗?
问题简而言之.如何将OpenID集成到MVC4 web api中,以允许使用可由多种语言调用和使用的Authorize标记?
所以我一直在使用DotNetOpenAuth一段时间,今天我需要添加对提供程序的支持,迫使我发送带有基本身份验证的密钥(我一直在使用旧版本,只有Post参数)
我试过用ClientCredentialApplicator.NetworkCredential,它没用.然后根据这里的建议,我已经做了我自己的ClientCredentialApplicator.
我仍然没有工作,我把断点放进去ApplyClientCredential,他们从来没有打过.
我升级到最新版本(4.3.0.0),应该有这个修复.
一切正常,但没有Authorization标题,远程服务器回答301错误(这让我认为它与提交相同的问题 - 授权信息未添加到请求,直到服务器回答Unauthorized和我正在使用的提供程序当没有Authorization标题时回答301
c# basic-authentication dotnetopenauth networkcredentials oauth-2.0
dotnetopenauth ×10
c# ×5
asp.net ×4
openid ×4
asp.net-mvc ×3
oauth-2.0 ×3
.net ×2
database ×1
dotnetnuke ×1
oauth ×1
rpxnow ×1