Как аутентифицировать пользователя с помощью Twitter, но не для входа в систему
У меня установлен MVC5, и через день я думаю, что пришло время обратиться за помощью, я никогда не был гуру OAuth, в остальном да, но нет. И я искал в интернете, но никто специально не фокусируется только на процессе аутентификации и ничем ином, или обсуждение так свободно, что я не могу понять концепцию логики для конкретной структуры, которую я пытаюсь изучить.
У меня есть контроллер MVC, и, на мой взгляд, когда пользователь нажимает кнопку для аутентификации, это простое действие называется Social. Так что мой URL http://localhost://mywebsite/enterprise/social
я знаю, что это школьные вещи, но мне нужна помощь, и я начинаю с самого начала, это ИСПОЛЬЗОВАНИЕ ДЛЯ РАБОТЫ 1.0 OAuth
,
Я не хочу использовать Twitter для входа в систему, он используется для настраиваемого ящика Twitter, который я создал несколько лет назад, и используется для твиттера, ретвита, в основном в то же время, как если бы они были в Твиттере. ЭТО НЕ ДЛЯ ИХ ВОЙТИ НА САЙТ.
Я хочу, чтобы использование было направлено в Twitter, они вошли в систему, перенаправлены обратно на ту же страницу MVC, я захватил токены, сохранил в моем личном хранилище и все было готово.
После всех звонков я делаю свои собственные звонки в базу данных и создаю свои собственные куки, для будущих звонков, потому что он уже создан, поэтому я буду продолжать его использовать, без особой цели.
Итак, вот мой контроллер, где я иду не так?
public async Task Social(FormCollection form)
{
//var auth = new MvcSignInAuthorizer
var auth = new MvcAuthorizer
{
CredentialStore = new InMemoryCredentialStore
{
ConsumerKey = ConfigurationManager.AppSettings["twitterConsumerKey"],
ConsumerSecret = ConfigurationManager.AppSettings["twitterConsumerSecret"]
}
};
string twitterCallbackUrl = Request.Url.ToString().Replace("Begin", "Complete");
auth.Callback = new Uri(twitterCallbackUrl);
await auth.BeginAuthorizationAsync();
}
public async Task<PartialViewResult> CompleteAsync()
{
var auth = new MvcAuthorizer
{
CredentialStore = new InMemoryCredentialStore()
};
await auth.CompleteAuthorizeAsync(HttpContext.Request.Url);
var credentials = auth.CredentialStore;
string oauthToken = credentials.OAuthToken,
oauthTokenSecret = credentials.OAuthTokenSecret,
screenName = credentials.ScreenName,
userName = Membership.GetUser().UserName;
ulong userID = credentials.UserID;
System.Web.Profile.ProfileBase pro = System.Web.Profile.ProfileBase.Create(userName, true);
pro.SetPropertyValue("twoauth_token", oauthToken);
pro.SetPropertyValue("twtokensecret", oauthTokenSecret);
pro.Save();
HttpContext.Response.SetOauthFromCookie("twit", oauthTokenSecret, oauthToken, userName, true);
ViewBag.IsTwitterConnected = IsTwitterConnected;
return PartialView("_SocialPartial");
}
Вот мой Startup.cs
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
app.UseTwitterAuthentication(
new TwitterAuthenticationOptions
{
ConsumerKey = ConfigurationManager.AppSettings["twitterConsumerKey"],
ConsumerSecret = ConfigurationManager.AppSettings["twitterConsumerSecret"],
Provider = new LinqToTwitterAuthenticationProvider()
});
}
}
}
Перестановка кода, чтобы сделать то, что мне нужно, чтобы сделать с MVC 5 4.6.2 Framework, будет УДИВИТЕЛЬНЫМ!
1 ответ
Я не уверен, что вы подразумеваете под "Я не хочу использовать Twitter для входа в систему". Если вы ссылаетесь на старый логин с именем пользователя / паролем, это устарело, и вы все равно не сможете его использовать. Тот System.Web.Profile...
а также SetOAuthFromCookie...
не являются частью LINQ to Twitter - возможно, это то, что вы называли кодом входа?
Похоже, вы хотите реализовать нормальный рабочий процесс OAuth. В этом случае я использую OAuthController
изолировать код и упростить мой код вызова, например так:
public class OAuthController : AsyncController
{
public ActionResult Index()
{
return View();
}
public async Task<ActionResult> BeginAsync()
{
//var auth = new MvcSignInAuthorizer
var auth = new MvcAuthorizer
{
CredentialStore = new SessionStateCredentialStore
{
ConsumerKey = ConfigurationManager.AppSettings["consumerKey"],
ConsumerSecret = ConfigurationManager.AppSettings["consumerSecret"]
}
};
string twitterCallbackUrl = Request.Url.ToString().Replace("Begin", "Complete");
return await auth.BeginAuthorizationAsync(new Uri(twitterCallbackUrl));
}
public async Task<ActionResult> CompleteAsync()
{
var auth = new MvcAuthorizer
{
CredentialStore = new SessionStateCredentialStore()
};
await auth.CompleteAuthorizeAsync(Request.Url);
// This is how you access credentials after authorization.
// The oauthToken and oauthTokenSecret do not expire.
// You can use the userID to associate the credentials with the user.
// You can save credentials any way you want - database,
// isolated storage, etc. - it's up to you.
// You can retrieve and load all 4 credentials on subsequent
// queries to avoid the need to re-authorize.
// When you've loaded all 4 credentials, LINQ to Twitter will let
// you make queries without re-authorizing.
//
//var credentials = auth.CredentialStore;
//string oauthToken = credentials.OAuthToken;
//string oauthTokenSecret = credentials.OAuthTokenSecret;
//string screenName = credentials.ScreenName;
//ulong userID = credentials.UserID;
//
return RedirectToAction("Index", "Home");
}
}
Обратите внимание, что CredentialStore
это SessionStateCredentialStore
, который сохраняет ваши токены в состоянии сеанса. Если вам не нравится способ сохранения учетных данных, внедрите свой собственный ICredentialStore
- это так расширяемо. Кроме того, посмотрите на комментарии в CompleteAsync
- они показывают, как извлечь все учетные данные для сохранения в БД (или пользовательские токены в куки, если хотите).
Так как учетные данные находятся в состоянии сеанса после авторизации, любой код, которому нужно запустить LINQ to Twitter, может проверить, доступны ли эти учетные данные, например:
if (!new SessionStateCredentialStore().HasAllCredentials())
return RedirectToAction("Index", "OAuth");
С помощью LINQ to Twitter, если у авторизатора есть все 4 учетные данные, вы можете создать TwitterContext
и делай, что тебе нужно. HasAllCredentials()
это то, что говорит вам, если все 4 из этих учетных данных доступны. Если нет, запустите процесс OAuth снова. Эта демонстрация переносит пользователя на страницу, чтобы запустить процесс авторизации вручную, но вы могли быть перенаправлены на BeginAsync
непосредственно.
Еще одним улучшением в реальном коде было бы изменение BeginAsync
поэтому он ищет учетные данные пользователя из базы данных (или другого хранилища, такого как cookie), заполняет SessionStateCredentialStore
и перенаправляет обратно к абоненту. Если учетные данные пользователя недоступны, то позвольте ему пройти через процесс OAuth, а затем сохраните учетные данные, чтобы вам больше не приходилось это делать.
Если вы хотите увидеть всю демонстрацию, посетите проект MVCDemo в папке LINQ to Twitter Samples.
Если вы получаете сообщение об ошибке ниже, вы должны заполнить свой "URL обратного вызова" в настройках приложения Twitter. Вот Q/A, где у кого-то была такая же проблема:
Настольные приложения поддерживают только значение oauth_callback 'oob'/oauth/request_token
Receiving Server Error
Server Error in '/' Application.
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<error>Desktop applications only support the oauth_callback value 'oob'</error>
<request>/oauth/request_token</request>
</hash>
- Please visit the LINQ to Twitter FAQ (at the HelpLink) for help on resolving this error.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: LinqToTwitter.TwitterQueryException: <?xml version="1.0" encoding="UTF-8"?>
<hash>
<error>Desktop applications only support the oauth_callback value 'oob'</error>
<request>/oauth/request_token</request>
</hash>
- Please visit the LINQ to Twitter FAQ (at the HelpLink) for help on resolving this error.
Source Error:
Line 55: protected async void AuthorizeButton_Click(object sender, EventArgs e)
Line 56: {
Line 57: await auth.BeginAuthorizeAsync(Request.Url);
Line 58: }
Line 59: }
Source File: D:\Users\Errrrrrr\Documents\visual studio 2015\ForTesting\LinqToTwitter-master\Samples\net46\CSharp\AspNetSamples\WebFormsDemo\OAuth.aspx.cs Line: 57
Stack Trace:
[TwitterQueryException: <?xml version="1.0" encoding="UTF-8"?>
<hash>
<error>Desktop applications only support the oauth_callback value 'oob'</error>
<request>/oauth/request_token</request>
</hash>
- Please visit the LINQ to Twitter FAQ (at the HelpLink) for help on resolving this error.]
LinqToTwitter.Net.<HandleUnauthorizedAsync>d__4.MoveNext() +494
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
LinqToTwitter.Net.<ThrowIfErrorAsync>d__0.MoveNext() +360
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
LinqToTwitter.<HttpGetAsync>d__57.MoveNext() +1159
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
LinqToTwitter.<GetRequestTokenAsync>d__50.MoveNext() +675
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
LinqToTwitter.<BeginAuthorizeAsync>d__14.MoveNext() +568
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
System.Runtime.CompilerServices.TaskAwaiter.GetResult() +28
WebFormsDemos.<AuthorizeButton_Click>d__2.MoveNext() in D:\Users\Edddddd\Documents\visual studio 2015\ForTesting\LinqToTwitter-master\Samples\net46\CSharp\AspNetSamples\WebFormsDemo\OAuth.aspx.cs:57
System.Runtime.CompilerServices.<>c.<ThrowAsync>b__6_0(Object state) +56
System.Web.Util.SynchronizationHelper.SafeWrapCallback(Action action) +110
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +14139120
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +62
System.Web.Util.WithinCancellableCallbackTaskAwaiter.GetResult() +32
System.Web.UI.<ProcessRequestMainAsync>d__523.MoveNext() +7762