【问题标题】:ASP Identity GenerateUserTokenAsync(string purpose, TKey userId) purpose optionsASP Identity GenerateUserTokenAsync(string purpose, TKey userId) 用途选项
【发布时间】:2014-11-01 07:56:30
【问题描述】:

所以 UserManager 有一个名为 GenerateUserTokenAsync(string purpose, TKey userId) 的函数。

这在 ASP Identity 中有什么作用?我可以使用它来生成 OAuth Bearer 令牌吗?还有目的参数是什么?这可以是什么值?

【问题讨论】:

    标签: asp.net asp.net-web-api asp.net-identity


    【解决方案1】:
    UserManager.GenerateUserTokenAsync(User, TokenProvider, Purpose)
    

    可用于为用户管理器未实现的目的生成令牌。

    一个例子是邀请系统。在 WebProject 中,您需要像这样创建一个 TokenProvider:

    public class InvitationTokenProvider<TUser> : DataProtectorTokenProvider<TUser> where TUser : class
    {
        public InvitationTokenProvider(IDataProtectionProvider dataProtectionProvider, IOptions<InvitationTokenProviderOptions> options, ILogger<DataProtectorTokenProvider<TUser>> logger) : base(dataProtectionProvider, options, logger)
        {
    
        }
    }
    

    和 InvitationTokenProviderOptions

    public class InvitationTokenProviderOptions : DataProtectionTokenProviderOptions
    {
    }
    

    然后你可以在StartUp.ConfigureServices()注册。

    services.AddIdentity<User, Role>(options =>
    {
        // ...
    }).AddEntityFrameworkStores<ApplicationDbContect>()
       .AddDefaultTokenProviders()
       .AddTokenProvider<InvitationTokenProvider<User>>("Invitation");
    

    之后您可以像这样将它与 UserManger 一起使用

    // create a token    
    string token = await _userManager.GenerateUserTokenAsync(user, "Invitation", "Invitation");
    // verify it
    bool result = await _userManager.VerifyUserTokenAsync(user, "Invitation", "Invitation", token);
    

    如果您要在 URL 中使用令牌,请不要忘记将其设为 URL-Safe(它可能包含“/”和其他符号。 还要检查尾随的“==”是否在通过电子邮件和浏览器的过程中丢失。

    【讨论】:

    • 我的验证结果总是返回false。我正在对令牌进行编码,然后使用 HttpUtility 对其进行解码。任何想法为什么会这样? cs var invitationToken = await _userManager.GenerateUserTokenAsync(user, "invitation", "invitation"); var _invitationToken = HttpUtility.UrlEncode(invitationToken); //verify var authorized = await _userManager.VerifyUserTokenAsync(dbUser,"invitation","invitation", HttpUtility.UrlDecode(invitationToken));
    • 首先我会在生成令牌时(在 UrlEncode 之前)使用调试器将令牌复制到文本编辑器,然后在您尝试验证它之前(在 UrlDecode 之后)再次复制。这样我发现我的电子邮件服务似乎删除了尾随的“==”。
    • 感谢您的回复。当我将令牌发送到我的 Api 时,发现这是 Angular 的问题。
    【解决方案2】:

    “GenerateUserTokenAsync”的文档说

    为特定目的获取用户令牌

    这种方法不应该直接使用,(不知道为什么它是公开的)。它用于生成密码重置令牌 (GeneratePasswordResetTokenAsync) 和电子邮件确认令牌 (GenerateEmailConfirmationTokenAsync)。它是这样使用的:

    GenerateUserTokenAsync("Confirmation", userId); // email confirmation
    
    GenerateUserTokenAsync("ResetPassword", userId); // password reset
    

    在令牌提供程序 (TotpSecurityStampBasedTokenProvider) 的默认实现中,目的是用作加密令牌生成中的某种密码。

    总的来说,你不需要使用GenerateUserTokenAsync,只需调用GeneratePasswordResetTokenAsyncGenerateEmailConfirmationTokenAsync即可。

    【讨论】:

    • 其公开的原因是应用程序可以免费使用 API 为自己的目的生成令牌。如果应用想要使用此 api 生成更改用户名令牌,他们可以直接使用具有自定义目的的 Generate/Validate 方法,例如 ("ChangeName")
    • 如何提供token provider?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2015-05-18
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多