gpt4 book ai didi

ios - ASP.NET 网络 API 2 : Login with external provider via native mobile (iOS) app

转载 作者:可可西里 更新时间:2023-11-01 03:19:36 25 4
gpt4 key购买 nike

我进行了大量搜索,但未能找到解决此问题的理想方案。我知道有一个所谓的解决方案( WebApi ASP.NET Identity Facebook login )但是,该解决方案的某些元素(在我看来)非常糟糕(例如,使用常规帐户注册用户然后添加外部登录,而不是使用外部登录)。

在 iOS 移动应用程序上使用 Facebook SDK 登录后,我希望能够针对 ASP.NET Web API 2 应用程序进行注册和身份验证,即我已经使用他们的 SDK 对 Facebook 进行了身份验证,现在想要无缝注册/验证 ASP.NET Web API。我不想使用必须使用网络调用 (/api/Account/ExternalLogin) 的过程,因为这在 native 移动应用程序上不是很好的用户体验。

我尝试学习 OWIN,但是 .NET 框架很复杂,我正在努力解决这个问题。

最佳答案

我今天需要为我的 Ionic 应用程序执行此操作。 Web API 帐户 Controller 对如何做事有自己的看法,理解它的最佳方法是阅读 Dominick Baier 这篇由 3 部分组成的令人惊叹的博客文章。 https://leastprivilege.com/2013/11/26/dissecting-the-web-api-individual-accounts-templatepart-3-external-accounts/ .

我解决它的方法是忘记开箱即用的流程,而是使用本地 Facebook 登录的 accessToken,然后调用以下服务器代码以 1) 调用 Facebook API 来验证访问 token ,2) 从那个 Facebook 调用中,获取电子邮件和 ID,3) 获取用户或创建它(和登录),这已经是其他地方帐户 Controller 中的代码,4)为创建本地权限 JWT后续 Web API 调用。

public class ProviderAndAccessToken {
public string Token { get; set; }
public string Provider { get; set; }
}

[AllowAnonymous]
[HttpPost]
[Route("JwtFromProviderAccessToken")]
public async Task<IHttpActionResult> JwtFromProviderAccessToken(ProviderAndAccessToken model) {
string id = null;
string userName = null;

if (model.Provider == "Facebook") {
var fbclient = new Facebook.FacebookClient(model.Token);
dynamic fb = fbclient.Get("/me?locale=en_US&fields=name,email");
id = fb.id;
userName = fb.email;
}

//TODO: Google, LinkedIn

ApplicationUser user = await UserManager.FindAsync(new UserLoginInfo(model.Provider, id));
bool hasRegistered = user != null;

string accessToken = null;
var identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);
var props = new AuthenticationProperties() {
IssuedUtc = DateTime.UtcNow,
ExpiresUtc = DateTime.UtcNow.Add(Startup.OAuthOptions.AccessTokenExpireTimeSpan),
};

if (hasRegistered) {
ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(UserManager,
OAuthDefaults.AuthenticationType);
ClaimsIdentity cookieIdentity = await user.GenerateUserIdentityAsync(UserManager,
CookieAuthenticationDefaults.AuthenticationType);

AuthenticationProperties properties = ApplicationOAuthProvider.CreateProperties(user.UserName);
Authentication.SignIn(properties, oAuthIdentity, cookieIdentity);


identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));
identity.AddClaim(new Claim("role", "user"));

}
else {

user = new ApplicationUser() { UserName = userName, Email = userName };

IdentityResult result = await UserManager.CreateAsync(user);
if (!result.Succeeded) {
return GetErrorResult(result);
}

result = await UserManager.AddLoginAsync(user.Id, new UserLoginInfo(model.Provider, id));
if (!result.Succeeded) {
return GetErrorResult(result);
}

identity.AddClaim(new Claim(ClaimTypes.Name, userName));
}

identity.AddClaim(new Claim("role", "user"));
var ticket = new AuthenticationTicket(identity, props);
accessToken = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);

return Ok(accessToken);
}

我在 Ionic 中使用的代码基本上执行此操作以从 Facebook 获取访问 token ,然后调用 Web API 以获取本地权限 JWT 以用作不记名 token 。

Facebook.login(['public_profile', 'email']).then((result) => {
return this.http.post("<URL>/api/Account/JwtFromProviderAccessToken", { provider: "Facebook", token: result.authResponse.accessToken })
.map((res: Response) => res.json())
.catch(this.handleError)
.subscribe((res: Response) => {
// use the result as the Bearer token
});
})...

看起来很安全,但我不是安全专家,所以这段代码没有保证,如果你看到任何明显的东西请告诉我,我会更新代码。

关于ios - ASP.NET 网络 API 2 : Login with external provider via native mobile (iOS) app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25302421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com